在Django admin中添加许多对象的内联

时间:2012-06-05 20:58:25

标签: python django django-forms django-admin

我是Django的新手并阅读了关于其关系模型和内联管理表单的文档(docs on 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对象上的外键。 在没有创建自定义表单,验证器等的情况下,我正在尝试实现的目标是什么? 非常感谢任何正确方向的提示,提前谢谢。

2 个答案:

答案 0 :(得分:26)

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

但如果您需要内联样式管理员,则应引用through-model。如果您没有指定自定义模型,Django会创建一个带有2个外键的简单模型,用于Director和Film。

所以你可以尝试创建像

这样的内联
class DirectorInline(admin.TabularInline):
    model = Film.director.through
    extra = 3

这不会引发异常并生成内联表单,但您必须从下拉列表中选择导向。我想你可以使用自定义表单覆盖它。

答案 1 :(得分:0)

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

admin.py

admin.site.register(Film)
admin.site.register(Director)