Как редактировать ManyToManyField в Django Admin List Показать страницу?
Я хочу добавить поля Many2Many, редактируемые на странице администратора Django list_display. Структура модели, как показано ниже,
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 ответа
Django по умолчанию не позволяет добавлять ManyToManyField в list_editable в ModelAdmin. Поэтому нам нужно переопределить методы администратора модели.
При просмотре ваших моделей вам нужно выполнить следующие шаги, чтобы получить возможность редактирования 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 для модели фильма. Вы можете редактировать поле ManyToMany прямо со страницы отображения списка.
Примечание. Если вы собираетесь использовать множественные поля ManyToManyFields, редактируемые в списке, вам нужно установить DATA_UPLOAD_MAX_NUMBER_FIELDS в settings.py.
Насколько я понимаю, вы хотите добавить модель на своей странице администратора.
для этого вам нужно просто сделать это в файле admin.py внутри приложения django
admin.site.register(MovieAdmin)
Это автоматически редактируется. Надеюсь это поможет.