第七章

这篇教程承接 教程第 6 部分 结束的地方。我们继续修改在线投票应用,这次我们专注于自定义我们在 教程第 2 部分 初见过的 Django 自动生成后台的过程。

自定义后台表单¶

通过 admin.site.register(Question) 注册 Question 模型,Django 能够构建一个默认的表单用于展示。通常来说,你期望能自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉 Django。

让我们通过重排列表单上的字段来看看它是怎么工作的。用以下内容替换 admin.site.register(Question):

polls/admin.py

fromdjango.contribimportadminfrom.modelsimportQuestionclassQuestionAdmin(admin.ModelAdmin):fields=['pub_date','question_text']admin.site.register(Question,QuestionAdmin)

你需要遵循以下流程——创建一个模型后台类,接着将其作为第二个参数传给 admin.site.register() ——在你需要修改模型的后台管理选项时这么做。

以上修改使得 "Publication date" 字段显示在 "Question" 字段之前:

这在只有两个字段时显得没啥卵用,但对于拥有数十个字段的表单来说,为表单选择一个直观的排序方法就显得你的针很细了。

说到拥有数十个字段的表单,你可能更期望将表单分为几个字段集:

polls/admin.py

fromdjango.contribimportadminfrom.modelsimportQuestionclassQuestionAdmin(admin.ModelAdmin):fieldsets=[(None,{'fields':['question_text']}),('Date information',{'fields':['pub_date']}),]admin.site.register(Question,QuestionAdmin)

fieldsets 元组中的第一个元素是字段集的标题。以下是我们的表单现在的样子:

添加关联的对象¶

好了,现在我们有了投票的后台页。不过,一个 Question 有多个 Choice,但后台页却没有显示多个选项。

好了。

有两个方法可以解决这个问题。第一个就是仿照我们向后台注册 Question 一样注册 Choice 。这很简单:

polls/admin.py

fromdjango.contribimportadminfrom.modelsimportChoice,Question# ...admin.site.register(Choice)

现在 "Choices" 在 Django 后台页中是一个可用的选项了。“添加选项”的表单看起来像这样:

在这个表单中,"Question" 字段是一个包含数据库中所有投票的选择框。Django 知道要将 ForeignKey 在后台中以选择框