デフォルトでは、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)
これで、変更を確認し、サーバーを実行し、ムービー モデルの django admin を確認するように設定されました。ManyToMany フィールドは一覧表示ページから直接編集できます。
注:リストで編集可能な複数の ManyToManyFields を使用する場合は、settings.pyで DATA_UPLOAD_MAX_NUMBER_FIELDS を設定する必要があります。