自定义管理站点

1 自定义后台表单

为模型创建管理类,并将它俩关联注册。

# polls/admin.py
from django.contrib import admin
from .models import Question

class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

fields 可以设置字段顺序,只有两个字段时没啥卵用,但对于拥有数十个字段的大表单来说就十分必要了,甚至还得划分字段集合 fieldsets 。

2 添加关联的对象

# polls/admin.py
from django.contrib import admin
from .models import Choice, Question

class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

“ Choice 对象要在 Question 后台页面编辑,请默认提供 3 个 Choice 。”

可是它占据了大量的屏幕区域。对此, Django 提供了一种紧凑的表示方法: class ChoiceInline(admin.TabularInline): 。注意额外的“删除?”列。

3 自定义后台更改列表

# polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date', 'was_published_recently')

列标题默认大写的方法名称(空格替换下划线),点击可排序。除了 was_published_recently ,因为它没有实现排序方法,得加个装饰器才行。

polls/models.py
from django.contrib import admin

class Question(models.Model):
    # ...
    @admin.display(
        boolean=True,
        ordering='pub_date',
        description='Published recently?',
    )
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

list_filter 添加字段可以筛选, search_fields 添加字段可以搜索,还有分页什么的,很多很多。

4 自定义后台界面和风格

django/contrib/admin/templates 里有大量模板,值得参考。