在Django管理员中,我希望像一样能够在列表显示中显示可编辑的ManyToManyField。
不一定需要完整的ManyToManyField控件-能够仅保存一个值就足以用于列表显示(尽管基础值本质上是多对多)。
我的模型如下所示:
class Item(models.Model):
name = models.CharField(max_length=500)
colour = models.ManyToManyField(Colour, related_name='primary_colour')
如果我在
admin.py
中尝试:class ItemAdmin(admin.ModelAdmin):
list_display = ('name', 'colour')
list_editable = ('colour')
然后我得到这个错误:
'ItemAdmin.list_display[6]', 'colour' is a ManyToManyField which is not supported.
我完全可以通过来表示,以便在列表显示中显示可编辑的ManyToManyField以便快速编辑吗?
我发现了这个相关问题,它说明了如何使值在列表显示中可见,但不可编辑:ManyToManyField widget in a django admin change list?
最佳答案
Django默认情况下不允许在ModelAdmin的list_editable中添加ManyToManyField。因此,我们需要重写模型管理方法。
在查看模型时,您需要按照以下步骤操作,以在列表显示页面中编辑ManyToManyField。
在apps/forms.py中,您需要定义需要在列表显示页面中进行编辑的ManyToMany字段。如下,
from django import forms
from app.models import Item
class ItemChangeListForm(forms.ModelForm):
# here we only need to define the field we want to be editable
colour = forms.ModelMultipleChoiceField(queryset=Colour.objects.all(),
required=False)
在app/admin.py中,您需要覆盖模型admin的方法。如下,
from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from app.models import Item
from app.forms import ItemChangeListForm
class ItemChangeList(ChangeList):
def __init__(self, request, model, list_display,
list_display_links, list_filter, date_hierarchy,
search_fields, list_select_related, list_per_page,
list_max_show_all, list_editable, model_admin):
super(ItemChangeList, self).__init__(request, model,
list_display, list_display_links, list_filter,
date_hierarchy, search_fields, list_select_related,
list_per_page, list_max_show_all, list_editable,
model_admin)
# these need to be defined here, and not in ItemAdmin
self.list_display = ['action_checkbox', 'name', 'colour']
self.list_display_links = ['name']
self.list_editable = ['colour']
class ItemAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return ItemChangeList
def get_changelist_form(self, request, **kwargs):
return ItemChangeListForm
admin.site.register(Item, ItemAdmin)
现在,您都准备检查更改,运行服务器并检查Movie模型的django admin。您可以直接从列表显示页面编辑ManyToMany字段。
注意:如果要使用列表中可编辑的多目标多对多字段,则需要在settings.py中设置DATA_UPLOAD_MAX_NUMBER_FIELDS。