django管理员更改列表中的ManyToManyField小部件?

时间:2011-10-02 22:57:07

标签: django autocomplete django-admin manytomanyfield

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

我在这里发现了类似的内容:list_editable and widgets

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

  

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

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

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

  

< django.db.models.fields.related.ManyRelatedManager对象位于0x1032a85d0>

有关如何进行的任何想法?有没有更好的方法呢?

以下是我目前的情况:( 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

谢谢!

2 个答案:

答案 0 :(得分:6)

这是一个古老的话题,但我希望这可能有助于其他人。

要获取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

答案 1 :(得分:0)

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

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

所以最终我意识到我要将多对多字段的名称替换为manytomany_field。它有效!