【问题标题】:Adding inline many to many objects in Django admin在 Django admin 中添加内联多对多对象
【发布时间】:2012-06-09 21:58:53
【问题描述】:

我对 Django 还很陌生,并且阅读了有关其关系模型和内联管理表单的文档 (docs on InlineModelAdmin) 我正在努力弄清楚以下内容是否可以开箱即用,或者我是否应该滚动我自己的表格。

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

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

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

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


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

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

【问题讨论】:

    标签: python django django-forms django-admin


    【解决方案1】:

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

    admin.py

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

    【讨论】:

      【解决方案2】:

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

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

      所以你可以尝试创建 inline like

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

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

      【讨论】:

      • Igor,(或其他任何人),您将如何向内联字段添加选项?
      • @Greg 我不太明白你想达到什么目的。如果您想将其他数据保存到您的 M2M 模型,您可以通过模型使用自定义 - docs.djangoproject.com/en/1.6/topics/db/models/… 如果您只想将字段添加到管理面板,您可以重新定义 DirectorInline.form
      • @Igor 如何重新定义 Inline.form?
      • @mamasi - 与为 admin link 定义自定义表单的方式相同,您可以为内联 link 定义表单
      • 是否可以将新的 Inline 实例的表单内联?也就是说,没有弹窗?
      猜你喜欢
      • 2020-04-16
      • 2011-12-31
      • 2013-11-17
      • 2011-08-28
      • 1970-01-01
      • 2010-12-20
      • 2011-02-23
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多