Django之第一个app<9>

添加相关的物体

好了,我们已经有了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这个按钮添加的行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值