# Django Admin

***

**1. Custom Admin Interface Theme**

```python
# /myproject/admin_custom.py
from django.contrib import admin
from django.contrib.admin import AdminSite

class CustomAdminSite(AdminSite):
    site_header = "My Custom Admin Site"
    site_title = "Custom Admin"

admin_site = CustomAdminSite()
```

**2. Model Admin Registration**

```python
# /app/models.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'author', 'isbn']

admin.site.register(Book, BookAdmin)
```

**3. Inline Model Admin**

```python
# /app/models.py
from django.contrib import admin
from .models import Book, Author

class AuthorInline(admin.StackedInline):
    model = Author

class BookAdmin(admin.ModelAdmin):
    inlines = [AuthorInline]

admin.site.register(Book, BookAdmin)
```

**4. Custom List Filter**

```python
# /app/filters.py
from django.contrib import admin
from django.contrib.admin import SimpleListFilter

class PublisherFilter(SimpleListFilter):
    title = 'Publisher'
    parameter_name = 'publisher'

    def queryset(self, request, queryset):
        value = self.value()
        if value:
            return queryset.filter(publisher=value)
        return queryset

# /app/admin.py
from django.contrib import admin
from .models import Book
from .filters import PublisherFilter

class BookAdmin(admin.ModelAdmin):
    list_filter = [PublisherFilter]

admin.site.register(Book, BookAdmin)
```

**5. Custom Model Form**

```python
# /app/forms.py
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'isbn', 'pages']

# /app/admin.py
from django.contrib import admin
from .models import Book
from .forms import BookForm

class BookAdmin(admin.ModelAdmin):
    form = BookForm

admin.site.register(Book, BookAdmin)
```

**6. Custom Model View**

```python
# /app/views.py
from django.contrib import admin
from .models import Book

class BookAdminView(admin.ModelAdmin):
    def change_view(self, request, object_id, form_url='', extra_context=None):
        context = super().change_view(request, object_id, form_url, extra_context)
        context['extra_data'] = 'Custom data for Book #{}'.format(object_id)
        return context

# /app/admin.py
from django.contrib import admin
from .models import Book
from .views import BookAdminView

class BookAdmin(BookAdminView):
    pass

admin.site.register(Book, BookAdmin)
```

**7. Custom Model Actions**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    actions = ['mark_as_read']

    def mark_as_read(self, request, queryset):
        queryset.update(is_read=True)
```

**8. Custom Model Permissions**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    def has_add_permission(self, request, obj=None):
        return request.user.is_superuser

    def has_delete_permission(self, request, obj=None):
        return request.user.has_perm('delete_book')
```

**9. Model Admin Hooks**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.updated_by = request.user
        super().save_model(request, obj, form, change)

    def save_formset(self, request, form, formset, change):
        super().save_formset(request, form, formset, change)
        instances = formset.save(commit=False)
        for instance in instances:
            instance.created_by = request.user
            instance.save()
```

**10. Custom Model Admin Site**

```python
# /app/admin.py
from django.contrib import admin
from django.contrib.admin import AdminSite

class MyAdminSite(AdminSite):
    site_header = "My Custom Admin Site"
    site_title = "Custom Admin"

admin_site = MyAdminSite(name='myadmin')
admin_site.register(Book)
```

**11. Model Admin Raw ID Fields**

```python
# /app/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)

class Author(models.Model):
    name = models.CharField(max_length=255)

# /app/admin.py
from django.contrib import admin
from .models import Book, Author

class BookAdmin(admin.ModelAdmin):
    raw_id_fields = ['author']

class AuthorAdmin(admin.ModelAdmin):
    pass

admin.site.register(Book, BookAdmin)
admin.site.register(Author, AuthorAdmin)
```

**12. Model Admin Custom Formset**

```python
# /app/admin.py
from django.contrib import admin
from django.contrib.admin.utils import get_deleted_objects
from .models import Book

class BookInlineFormset(admin.formsets.BaseFormSet):
    def get_deleted_objects(self):
        return [book.book for book in self.deleted_forms]

class BookAdmin(admin.ModelAdmin):
    formset = BookInlineFormset

admin.site.register(Book, BookAdmin)
```

**13. Model Admin List Display Links**

```python
# /app/admin.py
from django.contrib import admin
from django.utils.html import format_html
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'edit_link']

    def edit_link(self, obj):
        return format_html('<a href="{}">Edit</a>', obj.get_edit_url())

admin.site.register(Book, BookAdmin)
```

**14. Model Admin Stacked Inline**

```python
# /app/models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)

# /app/admin.py
from django.contrib import admin
from .models import Book, Author

class AuthorInline(admin.StackedInline):
    model = Author

class BookAdmin(admin.ModelAdmin):
    inlines = [AuthorInline]

admin.site.register(Book, BookAdmin)
```

**15. Model Admin Tabular Inline**

```python
# /app/models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)

# /app/admin.py
from django.contrib import admin
from .models import Book, Author

class AuthorInline(admin.TabularInline):
    model = Author

class BookAdmin(admin.ModelAdmin):
    inlines = [AuthorInline]

admin.site.register(Book, BookAdmin)
```

**16. Model Admin List Display Ordering**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    ordering = ['-title', 'author']

admin.site.register(Book, BookAdmin)
```

**17. Model Admin Search Fields**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    search_fields = ['title', 'author']

admin.site.register(Book, BookAdmin)
```

**18. Model Admin List Filter Options**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_filter = ['title', 'author']

admin.site.register(Book, BookAdmin)
```

**19. Model Admin Date Hierarchy**

```python
# /app/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    published_date = models.DateField()

# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    date_hierarchy = 'published_date'

admin.site.register(Book, BookAdmin)
```

**20. Model Admin List Display Boolean**

```python
# /app/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    is_published = models.BooleanField(default=False)

# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'is_published']

admin.site.register(Book, BookAdmin)
```

**21. Model Admin Read Only Fields**

```python
# /app/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    published_date = models.DateField()

# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    readonly_fields = ['published_date']

admin.site.register(Book, BookAdmin)
```

**22. Model Admin Change List View**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    change_list_template = 'admin/custom_change_list.html'

admin.site.register(Book, BookAdmin)
```

**23. Model Admin ModelForm Meta Exclude**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    formfield_overrides = {
        models.ManyToManyField: {'widget': admin.widgets.FilteredSelectMultiple('id', False)},
    }

admin.site.register(Book, BookAdmin)
```

**24. Model Admin ModelForm Meta Readonly**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    readonly_fields = ('author',)

admin.site.register(Book, BookAdmin)
```

**25. Model Admin ModelForm Meta Widgets**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    formfield_overrides = {
        models.CharField: {'widget': widgets.TextInput(attrs={'size': '20'})},
    }

admin.site.register(Book, BookAdmin)
```

**26. Model Admin ModelForm Meta Help Texts**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
            'help_texts': {'description': 'Provide a detailed description of the book.'},
        }),
    )

admin.site.register(Book, BookAdmin)
```

**27. Model Admin ModelForm Meta Initial Values**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    initial = {'author': request.user.pk}

admin.site.register(Book, BookAdmin)
```

**28. Model Admin ModelForm Meta Labels**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
            'labels': {'description': 'Book description'},
        }),
    )

admin.site.register(Book, BookAdmin)
```

**29. Model Admin ModelForm Meta Help Text**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
            'help_texts': {'description': 'Provide a detailed description of the book.'},
        }),
    )

admin.site.register(Book, BookAdmin)
```

**30. Model Admin ModelForm Meta Required Fields**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    required_fields = ('title', 'author', 'isbn', 'pages')

admin.site.register(Book, BookAdmin)
```

**31. Model Admin ModelForm Meta Exclude Fields**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    exclude = ('description',)

admin.site.register(Book, BookAdmin)
```

**32. Model Admin ModelForm Meta Order**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
        }),
    )

admin.site.register(Book, BookAdmin)
```

**33. Model Admin ModelForm Meta Fieldsets**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
        }),
    )

admin.site.register(Book, BookAdmin)
```

**34. Model Admin ModelForm Meta Widgets**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    formfield_overrides = {
        models.CharField: {'widget': widgets.TextInput(attrs={'size': '20'})},
    }

admin.site.register(Book, BookAdmin)
```

**35. Model Admin ModelForm Meta Initial Values**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    initial = {'author': request.user.pk}

admin.site.register(Book, BookAdmin)
```

**36. Model Admin ModelForm Meta Labels**

```python
# /app/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm
    fieldsets = (
        (None, {'fields': ('title', 'author', 'isbn', 'pages')}),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('description',),
            'labels': {'description': 'Book description'},
        }),
    )

admin.site.register(Book, BookAdmin)
```
