父母模型中一对多的儿童置换列表

时间:2011-05-11 13:31:38

标签: python django foreign-key-relationship displaylist

我正在学习django管理员,我必须在他们之间建立一对多关系的模型。 我得到了像制造商模型的东西,我可以添加不同的汽车制造商,以及添加汽车的汽车模型。在我的django管理页面中,当我点击manufacturer1条目时,我希望能够通过say manufacturer1 manfuctred display_list。

我通过在制造商管理模型中使用Inline模型找到了一个技巧,问题是它加载了数据库中的每个条目,并且它需要一些时间,因为它是一个大表。

有没有其他方法可以做到这一点,还是我必须创建一个新模板?

修改 目标不是将每个FK的Car加载到Manufacturer1,就像使用InlineModelAdmin一样,而是获得与display_list相同的显示,并将结果分成页面

3 个答案:

答案 0 :(得分:2)

回答您的最新问题:

采用ProxyModels并覆盖ModelAdmin.queryset

的方法可以做到这一点

您可以通过CarFordCar扩展GMCar模型,并在proxy=True类中使用Meta

然后,您可以为FordCarGMCar中的每一个注册单独的管理员,并覆盖每个ModelAdmin中的查询集方法,以过滤相应的制造商。

例如:

class FordCarAdmin(admin.ModelAdmin)
    list_display = fields = ['name','model','engine']

    def queryset(self,request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(manufacturer__name='Ford')

admin.site.register(FordCar,FordCarAdmin)

答案 1 :(得分:1)

你不需要任何黑客攻击。只要您使用InlineModelAdmin权利并按预期使用,当您选择Manufacturer1时,Django admin仅显示具有FK至Manufacturer1的汽车。

答案 2 :(得分:1)

您有两种选择。

最简单的方法是反过来看待这种关系。而不是去制造商改变形式,看到他们所有的汽车。转到汽车更改列表并按制造商过滤。您必须在汽车list_filter上设置ModelAdmin属性以包含制造商。

选项二,将会非常痛苦,但您可以覆盖制造商change_view上的ModelAdmin,将该制造商的汽车列表添加到extra_context。然后,您将必须覆盖'templates / admin / yourapp / manufacturer / change_form.html'中的管理模板。然后,您可以使用您传递到extra_context的汽车列表添加到该模板以生成您要查找的列表类型,并使用'django / contrib / admin / templates / change_list.html'获取灵感。

Django docs on the Admin完整阅读。那里实际上有很多信息。