Django admin:带有2个外键的Many2Many模型的内联

时间:2011-03-02 09:56:29

标签: django many-to-many admin inline-formset

经过几天的大脑震撼,我只希望有人能指出我正确的做法。 我有4个模型:页面,元素,样式和帖子。

以下是我简单的models.py/admin.py摘录:http://pastebin.com/uSHrG0p2

用2句话:

元素引用1个样式和1个帖子(2个FK)。

页面可以引用许多元素,元素可以被许多页面引用(M2M)。

在Page实例的管理站点上,我将M2M关系包含为“内联”。所以我有多行来选择Element-instances。 一行看起来像:[My Post A with My Style X] [V]

我想要的是用2个下拉列表替换掉一个下拉列表。一个包含Post的所有实例,一个包含Style的所有实例(就地创建Element实例)。所以一行看起来类似于Element管理站点:[我的帖子A] [V] [我的风格X] [V]

听起来很简单,但在阅读并使用ModelForms,ModelAdmins,Formsets,...进行为期2天的实验后,我才完全迷失了。 如果没有Django管理功能中的自定义视图/表单,我可以这样做吗?

我的一种方法是从这样的PageAdminForm访问Post / Style实例,尝试从中手动创建表单窗口小部件......但未能这样做:

p = Page.objects.get(pk=1)
f = PageAdminForm(instance=p)
f.base_fields['elements'].choices.queryset[0].post

任何建议或提示我需要走哪条路? 谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

删除M2M字段并将元素链接到元素中具有第3个ForeignKey的页面后,我得到了我想要的内容:

class Element(models.Model):
    page = models.ForeignKey(Page)        
    post = models.ForeignKey(Post)
    style = models.ForeignKey(Style)

实际上,非M2M链接对我的应用程序更有意义。

回忆自己:在试图超越Django之前重新思考模型关系: - (