如何在 Django 管理列表显示页面中编辑 ManyToManyField? [英] How To Edit ManyToManyField In Django Admin list Display Page?

查看:36
本文介绍了如何在 Django 管理列表显示页面中编辑 ManyToManyField?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 Django 管理列表_显示页面中添加可编辑的 Many2Many 字段.模型结构如下,

I want to add Many2Many fields editable in Django admin list_display page. The model structure as below,

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']

上面会抛出一个错误.

推荐答案

Django 默认不允许在 ModelAdmin 的 list_editable 中添加 ManyToManyField.所以我们需要覆盖模型管理方法.

Django by default won't allow to add ManyToManyField in list_editable in ModelAdmin. So we need to override model admin methods.

在查看模型时,您需要按照以下步骤在列表显示页面中获得可编辑的 ManyToManyField.

On looking your models you need to follow below steps to get the ManyToManyField editable in list display page.

apps/forms.py 中,您需要定义哪些多对多字段需要在列表显示页面中进行编辑.如下图,

In apps/forms.py you need to define which ManyToMany fields you need to make editable in list display page. As below,

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 中,您需要覆盖模型管理员的方法.如下图,

In app/admin.py you need to override methods of model admin. As below,

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.您可以直接从列表显示页面编辑多对多字段.

Now you all set to check the changes, run server and check django admin for Movie model. You can edit ManyToMany field directly from list display page.

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

Note : If you are going to use muliptle ManyToManyFields editable in list then, you need to set DATA_UPLOAD_MAX_NUMBER_FIELDS in settings.py .

这篇关于如何在 Django 管理列表显示页面中编辑 ManyToManyField?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆