Eel*_*lke 15 python django django-forms django-admin
我是Django的新手并且阅读了关于其关系模型和内联管理表单的文档(InlineModelAdmin上的文档)我正在努力弄清楚以下是否可以开箱即用,或者我是否应该滚动自己的表单.
假设我有两个对象:Films和Directors,这是模型声明中定义的多对多关系,如下所示:
class Film(Model):
director = ManyToManyField('Director')
Run Code Online (Sandbox Code Playgroud)
现在在Film对象的详细信息表单中,我想添加内联Director对象(它们只有一个名称字段作为唯一属性).不仅可以选择现有实例,还可以创建新实例,以Film对象的形式内联.
class DirectorInline(admin.TabularInline):
model = Director
extra = 3
class FilmAdmin(admin.ModelAdmin):
inlines = (
DirectorInline,
)
Run Code Online (Sandbox Code Playgroud)
这会引发错误,因为它需要Director对象上的外键.在没有创建自定义表单,验证器等的情况下,我正在尝试实现的目标是什么?如果提前感谢,我们将非常感谢任何正确方向的提示.
Igo*_*gor 26
admin或具有filter_vertical或filter_horizontal属性的小部件中的多对多字段的默认小部件允许您添加新项目.字段附近有一个绿色的"+"符号,用于打开弹出窗口并添加新的Director实例.
但是,如果您需要内联样式管理员,则应引用直通模型.如果您没有指定自定义模型,Django会创建一个带有2个外键的简单模型到Director和Film.
所以你可以尝试创建内联类似
class DirectorInline(admin.TabularInline):
model = Film.director.through
extra = 3
Run Code Online (Sandbox Code Playgroud)
这不会引发异常并生成内联表单,但您必须从下拉列表中选择导向.我想你可以使用自定义表单覆盖它.
小智 5
在 ManyToManyField 旁边添加“+”按钮的最简单方法是确保两个对象都在您的 admin.py 文件中注册。否则 Django 不会为第二种类型的对象创建表单
管理文件
admin.site.register(Film)
admin.site.register(Director)
Run Code Online (Sandbox Code Playgroud)