2011-05-11 99 views
0

我正在学习django管理员,我必须使用它们之间的一对多关系进行建模。 我得到了类似制造商模型的地方,我可以添加不同的汽车制造商,以及用于添加汽车的汽车模型。在我的django管理页面中,我希望能够通过制造商1当我点击制造商1条目时管理所有汽车的display_list。父母模型中儿童的显示列表一对多

我已经在生产管理模式采用在线模式找到了窍门,问题是,它加载数据库中的每个条目,它需要一些时间,因为它是一个很大的表。

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

编辑: 的目标是不加载每一辆汽车是FK到Manufacturer1像InlineModelAdmin但随着

回答

1

你有两个选择。

最简单的方法是看反向的关系。而不是去制造商改变形式,并看到他们所有的汽车。转到汽车更换列表并按制造商过滤。你必须设置在汽车ModelAdminlist_filter属性包括制造商。选项二将会是一个巨大的痛苦,但是您可以覆盖制造商ModelAdmin上的change_view,将制造商的汽车列表添加到extra_context。然后,您必须在'templates/admin/yourapp/manufacturer/change_form.html'中覆盖管理员模板。然后,您可以添加到模板产生的那种你正在寻找使用您传递到extra_context,在“Django的/的contrib /管理/模板/ change_list.html”绘画的灵感汽车的名单列表。

给这个Django docs on the Admin良好的透彻读。那里实际上有很多信息。

+0

我喜欢list_filter的主意! – Chakib 2011-05-11 23:57:27

1

你不需要任何黑客网页的结果分获得相同的显示与display_list 。 Django管理仅显示有FK到Manufacturer1汽车,当你选择Manufacturer1,只要你使用了正确的InlineModelAdmin和预期。

+0

是的,你是对的,但惠特InlineModelAdmin它加载所有的汽车有Fk给Manufacturer1但是,display_list拆分它们在页面中,这是非常方便的巨大的条目 – Chakib 2011-05-11 14:13:25

1

回答您的更新问题:

做到这一点可能是通过使用ProxyModels和压倒一切的方式ModelAdmin.queryset

你可以通过FordCarGMCar延长Car模型,并在Meta类使用proxy=True,对于那些。

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

例:

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) 
+0

Thanx你的例子我不知道代理模型,但我如果我必须创建每个品牌的ModelAdmin,将无法动态创建新的制造商。 – Chakib 2011-05-12 00:03:31