多对多字段的 Django 1.2.1 内联管理

Posted

技术标签:

【中文标题】多对多字段的 Django 1.2.1 内联管理【英文标题】:Django 1.2.1 Inline Admin for Many To Many Fields 【发布时间】:2011-03-10 08:14:00 【问题描述】:

我最近升级到 Django 1.2.1,因为我对 have basic many-to-many inline fields 的功能特别感兴趣。像这样使用管理员时:

初始模型:

class Ingredient(models.Model):
    name = models.TextField()

class Recipe(models.Model):
    ingredients = models.ManyToManyField(Ingredient)

初始管理员:

class IngredientInline(admin.TabularInline):
      model = Recipe.ingredients.through

class RecipeOptions(admin.ModelAdmin):
    inlines = [IngredientInline,]
    exclude = ('ingredients',)

admin.site.register(Recipe,RecipeOptions)        

我得到的是与您通常在 ManyToMany 字段中看到的相同的表单,但有一些额外的行。为它提供额外的参数(如成分模型表单)并没有帮助。怀疑通过 model = Foo.manyfields.through 的基本 ModelForm 关联可能有问题,我决定看看中间模型是否有帮助。它现在通过以下方式显示一个有效的内联表单:

新型号:

class RecipeJoin(models.Model):
    pass

class Recipe(models.Model):
    ingredients = models.ManyToManyField(RecipeJoin,through='Ingredient')

class Ingredient(models.Model):  
    name = models.TextField()
    test = models.ForeignKey(RecipeJoin,null=True,blank=True,editable=False)

新管理员:

class IngredientInline(admin.TabularInline):
    model = Recipe.ingredients.through

class RecipeOptions(admin.ModelAdmin):
    inlines = [IngredientInline,]

admin.site.register(Recipe,RecipeOptions)

显然这不是我想使用的 hack。任何人都知道一种通过内联表单显示多对多关系的方法,而无需 (a) 创建全新的 BasicInline 表单和模板或 (b) 将其置于中间(或通用管理员)模型中?

TIA。 (我为冗长表示歉意,这是我的第一篇文章,所以想要彻底)。

【问题讨论】:

【参考方案1】:

如果我没记错的话(自从我完成这部分以来已经有一段时间了),您需要为成分添加管理员并将其设置为具有自定义 ModelForm。然后,该表单将在成分的内联版本中使用。

【讨论】:

我也是这么想的,但我试了一下,得到了相同的下拉列表。很奇怪。【参考方案2】:

这些示例之一是否完成了您想要做的事情?

一个:

# Models:

class Ingredient(models.Model):
    name = models.CharField(max_length=128)

class Recipe(models.Model):
    name = models.CharField(max_length=128)
    ingredients = models.ManyToManyField(Ingredient, through='RecipeIngredient')

class RecipeIngredient(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredient = models.ForeignKey(Ingredient)
    amount = models.CharField(max_length=128)


# Admin:

class RecipeIngredientInline(admin.TabularInline):
    model = Recipe.ingredients.through

class RecipeAdmin(admin.ModelAdmin):
    inlines = [RecipeIngredientInline,]

class IngredientAdmin(admin.ModelAdmin):
    pass

admin.site.register(Recipe,RecipeAdmin)
admin.site.register(Ingredient, IngredientAdmin)

b:

# Models:

class Recipe(models.Model):
    name = models.CharField(max_length=128)

class Ingredient(models.Model):
    name = models.CharField(max_length=128)
    recipe = models.ForeignKey(Recipe)


# Admin:

class IngredientInline(admin.TabularInline):
    model = Ingredient

class RecipeAdmin(admin.ModelAdmin):
    inlines = [IngredientInline,]

admin.site.register(Recipe,RecipeAdmin)

【讨论】:

是的,我最终确实决定使用 ForeignKey,但我实际上是在寻找一种可以与 ManyToMany 字段一起使用的内联表单,因为 django 1.2 文档似乎说......这些工作,非常感谢!

以上是关于多对多字段的 Django 1.2.1 内联管理的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin 中自定义多对多内联模型

我们如何在 django 管理搜索字段中搜索多对多字段

Django 管理员多对多字段

用于递归多对多的 Django Admin 内联

格式化 django admin 中呈现的内联多对多相关模型

Django内联表单集通过另一个模型在多对多关系中过滤