添加相关的物体
好了,我们已经有了Question
模型管理页了,但是一个Question
模型对应多个Choice
模型,并且管理页并没有展示choice
模型。
有两种方式来解决这个问题。第一个是像我们对Question
所做的那样,用管理者来注册Choice
这个模型。
from django.contrib import admin
from .models import Question,Choice
class QuestionAdmin(admin.ModelAdmin):
fieldsets=[(None,{'fields':['question_text']}),('Date information',{'fields':['pub_date'],'classes':['collapse']})]
admin.site.register(Question,QuestionAdmin)
admin.site.register(Choice)
现在,Choice
就是一个Django管理者中的选项。Add choice
就是这样子了:
在图中的表单中Question
字段是一个包含数据库中每个问题的选择框。Django知道ForeignKey
代表着管理中的一个选择框,即<select>
。在我们这个例子中,现在只有一个问题存在。
注意,在Question
旁边有个Add Another
(绿色的十字架)。每个与其他物体有ForeignKey
关系的物体都会有这个。当你点击Add Another
时,就会跳出一个弹出式窗口,上面有Add Question
。如果你在窗口中添加一个问题,并且点击Save
的话,Django会将问题保存到数据库中。
但实际上,这是一个将Choice
模型添加到系统中的没有效率的方式。当你创建Question
对象的时候可以直接添加一系列Choice
,这是一个更好的方法。
移除对Choice
对象调用register()
方法。然后编辑Question
注册代码。
from django.contrib import admin
from .models import Question,Choice
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:Choice
这个对象会在Question
这个管理页被编辑。默认会提供3个choice的字段。
点击下Add question
来看一下加载的页面:
看一下,有三个存放与Choice
相关的位置,数量是由代码中的extra
决定的。每次你返回到Change
页面的时候,你都会得到三个额外的位置。
在三个当前的位置尾端,你会发现Add another Choice
这个链接。如果你点击它,就会添加一个新的位置,如果你想要移除它,可以点击在新添加的位置的左上方的”x”(叉号)。注意,你不可以移除原始的三个位置。下面的图片显示了一个新添加的位置:
但是有一个小的问题,这样会占据很多的空间来显示所有与Choice
对象有关的字段。对于这个,Django提供了解决方案,用列成表格的方式来展示内连的对象,你只需改变ChoiceInline
声明:
class ChoiceInline(admin.TabularInline):
有了TabularInline
(而不是StackedInline
),相关的物体就会以更简洁、以表的形式展示出来。
注意,有一个额外的Delete?
这一列允许你移除使用Add Another Choice
这个按钮添加的行。