Django的自定义admin站点(七)

我们将继续使用web-poll 应用程序,并将专注于自定义Django的自动生成的管理站点,

自定义管理表单

通过使用admin.site.register(Question)注册Question model,Django能够构造一个默认的表单表示法。通常,您需要定制admin表单的外观和工作方式。您将通过告诉Django在登记客体时所需要的选项来做到这一点。

让我们通过重新排序编辑表单中的字段来了解它是如何工作的。将admin.site.register(Question) 行替换为:

polls/admin.py

 from django.contrib import admin
 from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

您将遵循这个模式——创建一个model admin类,然后将其作为第二个参数传递给admin.site.register()——任何时候您需要更改 models 的 管理选项。

上面的这个特殊的变化使得“发布日期”出现在“Question”领域之前:

image.png

这对于只有两个字段来说并不令人印象深刻,但是对于有几十个字段的管理表单来说,选择一个直观的顺序是一个重要的可用性细节。

说到有几十个字段的表单,您可能想要将表单拆分为fieldset:

  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)

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


image.png

添加相关对象

好的,我们有一个Question管理页面,但是一个问题有多个Chioce,而管理页面没有显示选项。
然而。
有两种方法可以解决这个问题。第一种方法是在管理员中注册Chioce,就像我们对Question所做的那样。这很简单:

polls/admin.py

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

现在“选择”是Django管理员的一个可用选项。“添加选择”的形式是这样的:


image.png

在这种形式中,“Question”字段是一个包含数据库中所有问题的选择框。Django知道一个外键应该在admin中作为一个