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
里有大量模板,值得参考。