默认情况下,Django不允许在ModelAdmin的list_editable中添加ManyToManyField。因此,我们需要重写模型管理方法。
查看您的模型后,您需要按照以下步骤才能使ManyToManyField可编辑在列表显示页面中。
在
apps/forms.py中,您需要定义要在列表显示页面中进行编辑的ManyToMany字段。如下所示:
from django import forms
from app.models import Genre
class MovieChangeListForm(forms.ModelForm):
genre = forms.ModelMultipleChoiceField(queryset=Genre.objects.all(),
required=False)
在
app/admin.py中,您需要覆盖模型管理器的方法。如下所示,
from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from app.models import Movie
from app.forms import MovieChangeListForm
class MovieChangeList(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(MovieChangeList, 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)
self.list_display = ['action_checkbox', 'name', 'genre']
self.list_display_links = ['name']
self.list_editable = ['genre']
class MovieAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return MovieChangeList
def get_changelist_form(self, request, **kwargs):
return MovieChangeListForm
admin.site.register(Movie, MovieAdmin)
现在您已经准备好检查更改,运行服务器并检查Django管理页面中的电影模型。您可以直接从列表显示页面编辑ManyToMany字段。
注意:如果您将在列表中使用多个ManyToManyFields进行编辑,则需要在
settings.py中设置DATA_UPLOAD_MAX_NUMBER_FIELDS。
。之后,使用
inlines = [MovieGenreLinkInline]`将此内联表单添加到您的电影管理中。 - Max