Атрибут model класса StackedInline

Атрибут model класса StackedInline указывает, какая модель будет использоваться для отображения связанных записей на странице редактирования родительской модели в административной панели Django. Этот атрибут является обязательным и должен быть установлен в подклассе StackedInline. Он определяет, записи какой модели будут отображаться в виде вертикального стека полей внутри формы редактирования основной модели.

Синтаксис

pythonfrom django.contrib import admin
from .models import ParentModel, ChildModel

class ChildModelInline(admin.StackedInline):
  model = ChildModel

Пример

Рассмотрим пример использования атрибута model в классе StackedInline для связи моделей Category и Article. Для начала определим модели:

pythonfrom django.db import models

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

  def __str__(self):
    return self.name

class Article(models.Model):
  title = models.CharField(max_length=200)
  category = models.ForeignKey(Category, on_delete=models.CASCADE)
  published = models.BooleanField(default=False)

  def __str__(self):
    return self.title

Теперь создадим класс StackedInline с указанием атрибута model для модели Article, чтобы можно было редактировать статьи прямо на странице категории:

pythonfrom django.contrib import admin
from .models import Category, Article

class ArticleInline(admin.StackedInline):
  model = Article
  extra = 1

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
  inlines = [ArticleInline]

После регистрации администратора для модели Category на странице редактирования категории появится вложенная форма для добавления и изменения статей. Все поля модели Article будут отображаться в виде вертикального стека, что удобно для форм с большим количеством полей.

Пример

В этом примере настроим отображение только определенных полей модели в инлайн-форме, используя атрибут fields вместе с model:

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

class BookInline(admin.StackedInline):
  model = Book
  fields = ('title', 'year', 'is_published')
  extra = 2

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
  inlines = [BookInline]

Здесь мы ограничили отображение полей модели Book только тремя полями: title, year и is_published. Атрибут extra задает количество дополнительных пустых форм для добавления новых записей. На странице редактирования автора будут отображаться книги, связанные с ним, и поля будут расположены в виде вертикального стека.

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

  • класс TabularInline,
    который отображает связанные записи в табличной форме
  • атрибут model класса TabularInline,
    который также определяет модель для инлайн-отображения
  • атрибут extra,
    который задает количество дополнительных пустых форм
  • атрибут inlines класса ModelAdmin,
    который подключает инлайн-классы к админке