Атрибут 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,
который определяет поля, отображаемые в списке объектов