РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
607 of 818 menu

Атрибут inlines

Атрибут inlines класса ModelAdmin позволяет отображать и редактировать связанные модели (связь ForeignKey) непосредственно на странице изменения родительской модели в административной панели Django. Это удобно, когда нужно одновременно работать с основным объектом и его дочерними записями. В качестве значения атрибут принимает список классов встроенных форм, наследуемых от TabularInline или StackedInline.

Синтаксис

from django.contrib import admin from myapp.models import ParentModel, ChildModel class ChildInline(admin.TabularInline): model = ChildModel extra = 1 class ParentAdmin(admin.ModelAdmin): inlines = [ChildInline]

Пример . С TabularInline

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

from django.contrib import admin from myapp.models import Author, Book class BookInline(admin.TabularInline): model = Book extra = 2 fields = ('title', 'year', 'is_published') class AuthorAdmin(admin.ModelAdmin): list_display = ('name', 'birth_date') inlines = [BookInline] admin.site.register(Author, AuthorAdmin)

Результат выполнения кода:

"На странице редактирования автора появился блок для управления книгами"

Пример . Со StackedInline

Используем вертикальное отображение полей для более детальной работы с каждой дочерней записью. Например, для модели категории и продуктов:

from django.contrib import admin from myapp.models import Category, Product class ProductInline(admin.StackedInline): model = Product extra = 1 fields = ('name', 'price', 'description', 'in_stock') ordering = ('name',) class CategoryAdmin(admin.ModelAdmin): list_display = ('title', 'created_at') inlines = [ProductInline] admin.site.register(Category, CategoryAdmin)

Результат выполнения кода:

"Каждая книга отображается как отдельный блок с полями для ввода"

Настройка минимального количества форм

Используем атрибут extra для управления количеством пустых форм, отображаемых по умолчанию. В примере для модели автора и его публикаций:

from django.contrib import admin from myapp.models import Author, Publication class PublicationInline(admin.TabularInline): model = Publication extra = 3 min_num = 1 max_num = 10 class AuthorAdmin(admin.ModelAdmin): inlines = [PublicationInline] admin.site.register(Author, AuthorAdmin)

Результат выполнения кода:

"Отображается от 1 до 10 форм для публикаций, с 3 пустыми формами по умолчанию"

Пример . С кастомизацией отображения

Настраиваем отображение связанных записей с помощью методов, добавляем возможность удаления и контроля порядка отображения. Пример для модели заказа и его товаров:

from django.contrib import admin from myapp.models import Order, OrderItem class OrderItemInline(admin.TabularInline): model = OrderItem extra = 1 fields = ('product', 'quantity', 'price', 'total') readonly_fields = ('total',) can_delete = True ordering = ('-quantity',) def total(self, obj): return obj.quantity * obj.price total.short_description = 'Total price' class OrderAdmin(admin.ModelAdmin): list_display = ('id', 'customer', 'created_at', 'status') inlines = [OrderItemInline] admin.site.register(Order, OrderAdmin)

Результат выполнения кода:

"Товары в заказе отображаются с возможностью удаления, добавления и расчета стоимости"

Смотрите также

  • атрибут inlines,
    который управляет встроенными формами для связанных моделей
  • класс TabularInline,
    который отображает связанные модели в табличном виде
  • класс StackedInline,
    который отображает связанные модели в виде блоков
  • атрибут list_display,
    который определяет поля, отображаемые в списке объектов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить