如何在Django管理员列表显示页面中编辑ManyToManyField?

时间:2018-07-13 12:45:22

标签: python django django-forms django-admin django-modeladmin

我想添加在Django管理list_display页面中可编辑的Many2Many字段。 模型结构如下,

class Genre(models.Model):
    name = models.CharField(max_length=250, unique=True)


class Movie(models.Model):
    name = models.CharField(max_length=250)
    genre = models.ManyToManyField(Genre)

我尝试过,

class MovieAdmin(admin.ModelAdmin):
    list_display = ['name', 'genre']
    list_editable = ['genre']

上面是一个错误。

2 个答案:

答案 0 :(得分:2)

Django默认情况下不允许在ModelAdmin的list_editable中添加ManyToManyField。因此,我们需要重写模型管理方法。

在查看模型时,您需要按照以下步骤操作,以便在列表显示页面中编辑ManyToManyField。

apps/forms.py中,您需要定义需要在列表显示页面中进行编辑的ManyToMany字段。如下,

from django import forms
from app.models import Genre


class MovieChangeListForm(forms.ModelForm):

    # here we only need to define the field we want to be editable
    genre = forms.ModelMultipleChoiceField(queryset=Genre.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 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)

        # these need to be defined here, and not in MovieAdmin
        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 admin。您可以直接从列表显示页面编辑ManyToMany字段。

注意:如果您打算使用列表中可编辑的多轮多对多ToManyFields,则需要在settings.py中设置DATA_UPLOAD_MAX_NUMBER_FIELDS。

答案 1 :(得分:1)

据我了解,您想在管理页面中添加模型。

要这样做,您只需在Django应用中的admin.py文件中执行此操作

admin.site.register(MovieAdmin)

它是自动可编辑的。希望这会有所帮助。