Атрибут inlines

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

Синтаксис

pythonfrom 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

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

pythonfrom 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)

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

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

Пример . Со StackedInline

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

pythonfrom 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)

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

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

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

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

pythonfrom 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)

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

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

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

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

pythonfrom 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)

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

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

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

  • атрибут inlines,
    который управляет встроенными формами для связанных моделей
  • класс TabularInline,
    который отображает связанные модели в табличном виде
  • класс StackedInline,
    который отображает связанные модели в виде блоков
  • атрибут list_display,
    который определяет поля, отображаемые в списке объектов