Джанго админ: отображение связи многие ко многим

Как отображать объекты many-to-many в Django Admin

Для отображения объектов many-to-many в админке Django вы можете использовать атрибут filter_horizontal или filter_vertical в классе администратора модели.

Когда у вас есть поле many-to-many в модели Django, вы можете указать, как это поле будет отображаться в админке. Это полезно, если вы хотите предоставить простой способ для администраторов добавлять, удалять и редактировать связи между объектами.

Для использования атрибута filter_horizontal, добавьте его в класс администратора модели с указанием имени поля, которое вы хотите отображать:

from django.contrib import admin
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    filter_horizontal = ['your_many_to_many_field']

admin.site.register(YourModel, YourModelAdmin)

Для использования атрибута filter_vertical, добавьте его в класс администратора модели с указанием имени поля, которое вы хотите отображать:

from django.contrib import admin
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    filter_vertical = ['your_many_to_many_field']

admin.site.register(YourModel, YourModelAdmin)

Теперь поле many-to-many будет отображаться горизонтально или вертикально в админке в зависимости от того, какой атрибут вы использовали.

Детальный ответ

Использование Django admin для отображения связи "Многие-ко-Многим"

В Django админке есть возможность настраивать отображение связей "Многие-ко-Многим" между моделями. С помощью правильной настройки, вы сможете отображать и редактировать связанные объекты и упростить работу с вашими данными. В этой статье мы рассмотрим, как использовать функции Django admin для отображения связи "Многие-ко-Многим".

Создание моделей

Для начала, давайте создадим две модели, которые будут иметь связь "Многие-ко-Многим". Например, предположим, у нас есть модели "Автор" и "Книга", и у каждого автора может быть несколько книг, а каждая книга может иметь несколько авторов.


from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

    def __str__(self):
        return self.title

Здесь мы определяем две модели, Author и Book, и используем поле ManyToManyField для связи между ними. Поле authors в модели Book указывает, что у каждой книги может быть несколько авторов.

Регистрация моделей в админке

После создания моделей, необходимо зарегистрировать их в Django админке. Для этого создайте файл admin.py в вашем приложении и добавьте следующий код:


from django.contrib import admin
from .models import Author, Book

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name',)

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'display_authors')

    def display_authors(self, obj):
        return ", ".join([author.name for author in obj.authors.all()])

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)

В этом коде мы создаем классы AuthorAdmin и BookAdmin, которые наследуются от класса admin.ModelAdmin. Затем мы указываем, какие поля модели должны отображаться в списке записей. В случае модели Book мы также определяем метод display_authors, который возвращает строку со всеми именами авторов книги, разделенными запятыми.

Затем, мы регистрируем наши модели и их админские классы с помощью функции admin.site.register.

Отображение связанных объектов в админке

Теперь, если вы зайдете в админку и откроете список записей модели Book, вы увидите отображение всех связанных авторов с помощью метода display_authors. Вы сможете просмотреть и редактировать связанные авторы прямо из админки Django.

Вы также можете добавить возможность выбирать автора из списка при создании или редактировании книги, используя виджеты формы Django admin. Для этого в админском классе модели Book добавьте следующий код:


class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'display_authors')
    filter_horizontal = ('authors',)

В данном коде мы добавляем поле filter_horizontal и указываем, какие связанные объекты будут отображаться в виджете формы. В данном случае, будет использоваться виджет с горизонтальной прокруткой для выбора авторов.

Заключение

Использование Django admin для отображения связи "Многие-ко-Многим" может быть очень удобным для работы с данными. Вы можете отображать и редактировать связанные объекты прямо из админки, что позволяет с легкостью управлять вашими моделями.

Видео по теме

25 Tabular Inline in the Admin for ManyToMany

Django ORM - Django Admin Many-to-Many intermediate model setup

Django ORM Course | Many to Many

Похожие статьи:

Как использовать аргументы reverse в Django URL?

Джанго админ: отображение связи многие ко многим