【问题标题】:Django: "reverse" many-to-many relationships on formsDjango:“反转”表单上的多对多关系
【发布时间】:2011-04-22 12:09:14
【问题描述】:

我所说的这种关系最简单的例子是 Django 的用户和组之间的关系。 User 表有一个 ManyToMany 字段作为其定义的一部分,而 Group 表是“反面”。

关于我的限制的说明:我根本不使用管理界面,也不是一个选项。

现在,进入编程问题。我需要编写一个用于编辑 MyGroup 实例的表单,简单定义如下:

class MyGroup( Group ):
  some_field = models.CharField( max_length=50 )

我希望能够有一个表单页面,我可以在其中编辑some_field 以及哪些用户是该组的成员。因为我正在使用模型,所以 ModelForm 似乎很明显。但我不知道如何让 Django 包含用户,因为它位于用户组关系的反面。理想情况下,我希望用于指定用户的显示小部件与在管理员中的用户和组页面上找到的用于指定权限的小部件一样。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    我从来没有找到一个很好的方法来做到这一点。我最终编写了自定义表单来管理创建字段并在它们上指定适当的查询集。

    对于问题的显示部分,有一种方法可以在常规页面上使用 SelectFilter(也称为水平过滤器)。我找到的一页说明是 here,还有另一页很有帮助,但我似乎无法重新定位它。

    我正在考虑为这个过程的两个部分编写一份更全面的指南。如果有人感兴趣,请告诉我,它会给我推动实际完成它的动力。

    【讨论】:

      【解决方案2】:

      inline-formsets

      为外键关系解决问题。

       GroupUserInlineFormSet = inlineformset_factory(MyGroup, User, form=PurchaseOrderEditForm, max_num=100, extra=2, can_delete=False)
      
       guformset = GroupUserInlineFormSet (instance=mygroup)
      

      可能会为您指明正确的方向。不确定这如何处理多对多关系。

      【讨论】:

      • 它可以作为一对多关系的子案例 - 应该有 ListView ,他/她选择一个模型,然后 UpdateView ,其中内联表单集用于添加/删除许多关系。