===================================== 编写您的第一个Django应用, 第7部分 ===================================== 本教程上接 :doc:`教程 6 `。我们将继续完成网页投票应用,并着重讲解 如何用 Django 自动生成管理网站,我们曾在 :doc:`教程 2` 中初次探索过。 自定义管理表单 ======================== 通过 ``admin.site.register(Question)`` 注册 ``Question`` 后,Django 可以自动构建一个 默认的表单。通常,您想自定义管理表单的外观和功能。您可以在注册时通过配置来实现。 现在先来试试排序表单上的字段。将 ``admin.site.register(Question)`` 所在行替换为: .. snippet:: :filename: 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()``。 而且这种操作在任何时候都可以进行。 经过上面更改,“Publication date”字段会在“Question”字段之前: .. image:: _images/admin07.png :alt: Fields have been reordered 目前的表单只有两个字段可能看不出什么,但是对于字段很多的表单,设计一个直观合理的排序方式非常重要。 并且在字段数据很多时,还可以将表单分割成多个字段的集合: .. snippet:: :filename: 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) :attr:`~django.contrib.admin.ModelAdmin.fieldsets` 中的每个元组的第一个元素是字段集合的标题。 它让表单看起来像下面的样子: .. image:: _images/admin08t.png :alt: Form has fieldsets now 添加关联对象 ====================== 现在我们有了问题管理页面,但是一个 ``Question`` 有多个 ``Choice``,而管理页面并没有显示。 暂时。 现在有两个方法可以解决这个问题:一是就像刚刚 ``Question`` 一样也将 ``Choice`` 注册到管理界面。 这简单: .. snippet:: :filename: polls/admin.py from django.contrib import admin from .models import Choice, Question # ... admin.site.register(Choice) 现在“Choice”也可以管理页面看到了,其中“Add choice”表单应该类似这样: .. image:: _images/admin09.png :alt: Choice admin page 在这个表单中,“Question”字段是一个选择框,包含了当前数据库中每个问题实例。Django 知道将 :class:`~django.db.models.ForeignKey` 展示为一个 ``