在Django管理中添加内联多对多对象

2024-05-15 19:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Django还不太熟悉,在阅读了它的关系模型和内联管理表单(docs on InlineModelAdmin)的文档之后,我很难弄清楚以下内容是否可以开箱即用,或者我是否应该滚动自己的表单。

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

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

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

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


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

这将抛出一个错误,因为它需要Director对象上的外键。 在不创建自定义表单、验证程序等的情况下,我试图实现的目标是否可行? 任何正确的建议都将非常感谢,谢谢提前。


Tags: 对象django实例文档模型表单docs电影
2条回答

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

管理.py

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

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

但如果需要内联样式管理,则应该引用through-model。如果不指定自定义模型,Django将创建一个简单模型,其中包含两个指向Director和Film的外键。

所以你可以尝试创建

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

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

相关问题 更多 >