【问题标题】:ManyToManyField widget in a django admin change list?django 管理员更改列表中的 ManyToManyField 小部件?
【发布时间】:2011-11-29 14:18:36
【问题描述】:

在 django 管理员的更改列表中,我想使用 list_editable 为 ManyToManyField 显示 django-autocomplete 小部件。

我在这里找到了类似的东西:list_editable and widgets

通常在 list_display 中包含 ManyToManyField 会引发 ImproperlyConfigured 异常,例如:

""'BookAdmin.list_display[2]', 'author' 是不支持的 ManyToManyField。"

我(也许不明智地)从 contrib/admin/validate.py 中删除了 3 行以绕过异常。 :)

我现在让它吐出以下内容,很接近(?)但没有雪茄。

关于如何进行的任何想法?有更好的方法吗?

这是我目前所拥有的:(AuthorAutocomplete 在常规管理表单中运行良好)

class AuthorAutocomplete(AutocompleteSettings):
    search_fields = ('first_name', 'last_name')

class BookAdmin(AutocompleteAdmin, admin.ModelAdmin):
    def get_changelist_form(self, request, **kwargs):
      kwargs.setdefault('form', AuthorAutocompleteForm)
      return super(BookAdmin, self).get_changelist_form(request, **kwargs)    
      list_display = ['isbn', 'title', 'author', 'publisher']
      #...

class AuthorAutocompleteForm(forms.ModelForm):
    class Meta:
        model  = Book
    author = AuthorAutocomplete

谢谢!

【问题讨论】:

  • 糟糕的开发人员,糟糕。永远,永远,永远改变 Django 源代码。我自己没有尝试过这样做,但如果管理应用程序明确禁止ManyToManyFields,这是有原因的。在保存模型的过程中,某处无法正常运行。如果它是对您很重要的功能,请考虑为它提交错误。否则,你可能只是运气不好。修补 Django 源代码将为您和将来碰巧继承您的代码的任何可怜的开发人员制造维护噩梦。

标签: django autocomplete django-admin manytomanyfield


【解决方案1】:

这是一个老话题,但我希望这可能对其他人有所帮助。

要获取 ManyToMany 字段的值以便显示它们的值,您可以执行以下操作。我以 list_display 为例。

class TestAdmin(admin.ModelAdmin):
    def get_some_value(self):
        return ", " . join([x.__str__() for x in self.manytomany_field.all()])

    list_display(get_some_value)
    get_some_value.short_description = 'Title' #sets column header to Title

【讨论】:

    【解决方案2】:

    我傻了。我认为威廉的 manytomany_field 是一个内置的 ModelAdmin 对象。所以我按原样运行他的代码(在加入后加入缺少的括号之后)。

    奇怪的是,它运行时没有产生错误消息。但是(无)出现在我应该获得价值的时候。我觉得奇怪的是,当我用谷歌搜索“django model.Admin.manytomany_field”时,我什么也找不到。哈!

    所以最终我意识到我应该用多对多字段的名称代替 manytomany_field。有效!

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2011-05-19
      • 2013-03-17
      • 2015-01-23
      • 2016-04-27
      • 2011-09-29
      • 2011-10-09
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多