将models.ManyToManyField显示为内联,其格式与models.ForeignKey inline相同

时间:2010-03-23 15:24:57

标签: django django-models django-admin

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

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.samplesForeignKey而不是ManyToManyField,那么当我在Action中将TabularInline显示为Sample时在Django Admin中,我会得到许多行,每行包含一个很好的表单来编辑或添加另一个Action。然而;当我使用以下内容将上面显示为内联时:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

e.g。

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个用于Action模型,1个用于Sample),这就是为什么只显示操作列表的原因。

如果django admin支持嵌套内联(there is an open ticket有关此内容),您可以按照要求执行操作。