24

我对 Django 相当陌生,并且已经阅读了有关其关系模型和内联管理表单的文档(InlineModelAdmin 上的文档)我正在努力弄清楚以下内容是否可以开箱即用,或者我是否应该推出自己的表单.

假设我有两个对象:电影和导演,这是模型声明中定义的多对多关系,如下所示:

class Film(Model):
    director = ManyToManyField('Director')

现在在 Film 对象的详细信息表单中,我想添加内联 Director 对象(它们只有一个名称字段作为唯一属性)。不仅选择现有实例,而且能够以Film 对象的形式内联创建新实例。

class DirectorInline(admin.TabularInline):
    model = Director
    extra = 3


class FilmAdmin(admin.ModelAdmin):
    inlines = (
        DirectorInline,
        )

这会引发错误,因为它需要 Director 对象上的外键。在不创建自定义表单、验证器等的情况下,我想要实现的目标是否可行?任何正确方向的提示将不胜感激,在此先感谢。

4

2 回答 2

37

管理员中的多对多字段的默认小部件或带有filter_verticalfilter_horizontal属性的小部件允许您添加新项目。字段附近有一个绿色的“+”号,用于打开弹出窗口并添加新的 Director 实例。

但是,如果您需要内联样式管理员,您应该参考through-model。如果您不指定自定义模型,Django 会创建一个简单的模型,其中包含 Director 和 Film 的 2 个外键。

所以你可以尝试创建内联

class DirectorInline(admin.TabularInline):
    model = Film.director.through
    extra = 3

这不会引发异常并会生成一个内联表单,但您必须从下拉列表中选择董事。我认为您可以使用自定义表单来覆盖它。

于 2012-06-12T14:46:04.717 回答
5

在 ManyToManyField 旁边添加“+”按钮的最简单方法是确保两个对象都已在 admin.py 文件中注册。否则 Django 不会为第二种类型的对象创建表单

管理员.py

admin.site.register(Film)
admin.site.register(Director)
于 2018-07-04T01:52:03.623 回答