【问题标题】:Show models.ManyToManyField as inline, with the same form as models.ForeignKey inline将 models.ManyToManyField 显示为内联,与 models.ForeignKey 内联形式相同
【发布时间】:2011-01-30 20:42:20
【问题描述】:

我有一个类似于以下的模型(简化):

models.py

class Sample(models.Model):  
    name=models.CharField(max_length=200)  

class Action(models.Model):  
    samples=models.ManyToManyField(Sample)
    title=models.CharField(max_length=200)  
    description=models.TextField()  

现在,如果 Action.samples 本来是 ForeignKey 而不是 ManyToManyField,当我在 Django Admin 中的 Sample 中将 Action 显示为 TabularInline 时,我会得到一些行,每个都包含一个很好的表单来编辑或添加另一个Action。然而;当我使用以下内容将上述内容显示为内联时:

class ActionInline(admin.TabularInline):
    model=Action.samples.through

我得到一个列出所有可用操作的选择框,而不是一个漂亮的表单来创建新的Action

我的问题确实是:如何将 ManyToMany 关系显示为内联表单以输入所描述的信息?

原则上应该是可能的,因为从Sample 的角度来看,两种情况下的情况是相同的;每个Sample 都有一个Actions 列表,无论关系是ForeignKey 还是ManyToManyRelation。还;通过Sample 管理页面,我不想从现有的Actions 中进行选择,只想创建新的或编辑旧的。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    我明白你的意思,但想想你可能需要通过模型(表格)使用自定义的情况。在这种情况下,管理员内联表单将包含该中间模型的字段,因为那是您要求管理员为其创建表单的模型。

    例如

    class Person(models.Model):
        name = models.CharField(max_length=128)
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(Person, through='Membership')
    
    class Membership(models.Model):
        person = models.ForeignKey(Person)
        group = models.ForeignKey(Group)
        date_joined = models.DateField()
        invite_reason = models.CharField(max_length=64)
    

    管理员应该显示 Memebership 模型的表单,因为这是可编辑实例相关的模型。 在您的情况下,直通模型仅包含 2 个外键(1 个用于操作模型,1 个用于示例),这就是为什么只显示操作列表的原因。

    如果 django 管理员支持嵌套内联(there is an open ticket 关于这一点),您可以按照您的要求进行操作。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多