Django教程之八-----编写你的第一个Django应用(7)

这个教程紧跟教程(6)。我们将继续网页问卷调查应用并且将聚焦在定制Django的自动生成管理站点,这在教程(2)的时候我们有过首次接触。


1. 自定义管理形式

通过使用admin.site.register(Question)来注册Question模型,Django能组成一个默认的窗体展示。通常,你将想要自定义管理站点的外观和行为。当注册对象的时候你可以通过告诉Django你想要的选项来完成这个。


让我们看看通过在编辑窗体上重排序是如何工作的。用下面的代码替换这一行admin.site.register(Question):

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)

你遵照这种形式 -- 创建一个模型管理类,然后将它作为第二个参数传递给admin.site.register() -- 任何时候你需要改变一个模型的管理选项。


上面的特别的修改让“发布时间”出现在“Question”字段之前:

Django教程之八-----编写你的第一个Django应用(7)_第1张图片

只有2个字段并不会让人印象深刻,但是对于有几十个字段的管理窗口来说,选择一个直观的顺序是一个重要的可用细节。


说到几十个字段的窗体,你也许想要将窗体拆分成字段集:

polls/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)

在fieldsets中的每个元组的第一个元素是fieldset的标题。这就是我们窗体现在的样子:

Django教程之八-----编写你的第一个Django应用(7)_第2张图片


2. 添加相关对象

OK,我们有了自己的管理页面,但是一个Question有多个Choices,但是管理站点没有显示choices。


仍然。


有2种方式来解决这个问题。第一个是像我们注册Question一样在admin中注册Choice。那很简单:

polls/admin.py
from django.contrib import admin

from .models import Choice, Question
# ...
admin.site.register(Choice)

现在“Choices”在Django管理里是一个可选项了。添加“choice”的窗体是这样的:

Django教程之八-----编写你的第一个Django应用(7)_第3张图片

在那个窗体中,“Question”字段是一个选择框,它包含了数据库中的每个问题。Django知道ForeignKey在管理中应该作为一个