这个教程将关注于自定义django生成的管理站。
1.admin中注册模型
修改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)
这里相比之前的教程,调换了两个域的顺序。
遵循这个模式:创建一个模型的管理类如:QuestionAdmin,将它作为第二个参数传递给admin.site.register()
2.分组和分区
我们可以将域划到多个组,编辑admin.py如下:
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
显示效果如下:
3.添加关联对象
我们可以同part2一样:通过admin.site.register(Choice)简单注册模型。
Choice中ForeignKey对应的Question,会以< select>box出现在Choice管理页面。
但这不是一个好的方式,如果我们能在创建question时直接添加一些Choice会更好,如下(我们应该移除admin.site.register(Choice))
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)
这将告诉django:Choice将在Question管理页中被编辑。
将StackedInline改为TabularInline可以让Choice以列的形式展现,减少空间占用。
4.修改Question管理页,展现更多信息。
默认django展示每个对象的str(),使用list_display管理选项,可以增加更多的信息。在QuestionAdmin中增加:
list_display = (‘question_text’, ‘pub_date’)
还可以将函数was_published_recently添加进去。
我们可以点击列头进行排序,但是对于该函数,现在却不能直接操作。
我们可以为Question模型增加如下方法,解决该问题
class Question(models.Model):
# ...
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
admin_order_field指定排序依据,负号表示降序。
boolean让返回True or False的方法显示更好(False变成了x图标)
short_description让指定列头的显示内容
5.为该管理页增加筛选器
list_filter = [‘pub_date’]
django会自动生成相关的筛选器,如today , this month等
6.自定义管理页的观感
在manage.py同目录下新建templates目录,修改mysite/settings.py,在TEMPLATES中增加
‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)],
DIRS是一个查找路径,在加载django模板时检查该文件目录列表。属于应用程序的模板放在应用程序下,属于项目的模板放在该目录下。因为APP_DIRS为True,所以DIRS为空时,他会在APP中找到管理模板(admin.contrib也是一个APP)。
在该目录下创建一个admin目录,将django中默认的admin/base_site.html复制到该目录(通过执行python -c “import django; print(django.path)”发现django所在位置,打开django/contrib/admin/templates即可)
将拷贝过来的base_site.html中的{{ site_header|default:_(‘Django administration’) }}替换成”Polls Administration”
这是一个覆盖的示例,在实际项目中,我们可以使用:
django.contrib.admin.AdminSite.site_header更简单地进行自定义。
admin管理站首页默认包含所有INSTALLED_APPS中的app并且在admin.py中注册过的