django官方demo翻译简化版 七(demo终)

本篇集中于讲解修改django自带的admin后台的外观及样式。

定制form表单

通过把<span>Question</span> 模型注册在admin.site.register(Question)里面。django可以生成一个默认的表单结构。但是我们经常会需要一些自定义的表单结构。你可以在注册的时候提供你的需求信息来达到定制的效果。

现在来实现这个,修改admin.py文件:

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类,然后把它作为一个参数传递给admin.site.register())。

上述修改会让Publication date显示在Question前面:

django官方demo翻译简化版 七(demo终)

这种操作在只有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)

<span><a>fieldsets</a>里的</span>元组里的第一个元素就是自定义字段的标题。现在我们的表单的展示如下图:

django官方demo翻译简化版 七(demo终)

增加相关的类

到了这一步,我们的Question 类的页面已经写好了,但是还有个问题需要处理,那就是每个问题都有多个选项,但是我们并没有展示出来。

这个问题有2个解决方法。第一个方法是在admin里面注册Choice,就像前面注册Question一样:

polls/admin.py


from django.contrib import admin

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

现在“Choices”是一个在django admin里面的可选项。“Add choice”表单将会像下图显示一样:

django官方demo翻译简化版 七(demo终)

在这个表单中,“Question”是一个可选下拉框。django知道<span><a>ForeignKey</a>应该在admin里以一个可选下拉框的形式出现。在我们的这种情况下,只会展示一个问题。<br /></span>

同时,我们需要注意下“Question.”旁边的 “Add Another”链接。每个拥有外键的对象都会有这个功能。当你点击这个链接的时候,都会有一个新增问题弹框出来让你做新增操作。一旦你填写并提交保存后,就会把这个记录提交到数据库并且动态的将你选的choice关联到这个问题上面。

但是,说实话,这种方式并不高效。假如你可以在增加问题的时候就可以添加选项的话,效率应该更高。

移掉前面我们使用register()方法来注册Choice模型的相关代码,然后重新修改下<span>Question</span> 模型的注册方式如下:

polls/admin.py


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,我们将在Question的管理页面上编辑Choice类,并且会默认提供三个选项。

重新加载这个程序,然后你会看到如下界面:

django官方demo翻译简化版 七(demo终)

它会通过extra字段值来确定每个问题会默认提供多少个选项。

在choice下面还有“Add another Choice”链接可以使用。你点击后就会新增一个choice选项,然后你可以通过选项上的“X”来进行删除。但是需要注意的是,默认提供的三个选项是无法被删除的。如下图:

django官方demo翻译简化版 七(demo终)

这里还有一个小问题。现在的这种方式,choice占用了太多的屏幕空间。基于这种情况,django提供了另外一种方式:

polls/admin.py

class ChoiceInline(admin.TabularInline):
    #...

通过使用<span>TabularInline</span>而不是StackedInline,相关联的部分会使用更少的空间:

django官方demo翻译简化版 七(demo终)