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

Класс StackedInline

Класс StackedInline применяется в административной панели Django для создания встраиваемых форм связанных моделей. Он наследуется от InlineModelAdmin и отображает связанные объекты в виде вертикального списка полей. Основные параметры: model - связанная модель, extra - количество пустых форм для добавления, fk_name - имя внешнего ключа, если их несколько.

Синтаксис

from django.contrib import admin from .models import ParentModel, ChildModel class ChildModelInline(admin.StackedInline): model = ChildModel extra = 1 class ParentModelAdmin(admin.ModelAdmin): inlines = [ChildModelInline] admin.site.register(ParentModel, ParentModelAdmin)

Пример

Рассмотрим модели Author и Book, где один автор может иметь много книг. Используем StackedInline для редактирования книг на странице автора:

from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateTimeField() is_bestseller = models.BooleanField(default=False) def __str__(self): return self.title

Теперь создадим встраиваемый класс в админке:

from django.contrib import admin from .models import Author, Book class BookInline(admin.StackedInline): model = Book extra = 2 fields = ['title', 'published_date', 'is_bestseller'] @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): list_display = ['name', 'email'] inlines = [BookInline]

В результате на странице редактирования автора будет отображаться форма для добавления и редактирования книг. Параметр extra=2 добавит две пустые формы для новых книг.

Пример . С несколькими внешними ключами

Если модель имеет несколько внешних ключей на одну и ту же родительскую модель, используйте параметр fk_name для указания нужного поля:

from django.db import models class User(models.Model): username = models.CharField(max_length=50) class Transaction(models.Model): sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_transactions') receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_transactions') amount = models.IntegerField()
from django.contrib import admin from .models import User, Transaction class SentTransactionInline(admin.StackedInline): model = Transaction fk_name = 'sender' extra = 1 class ReceivedTransactionInline(admin.StackedInline): model = Transaction fk_name = 'receiver' extra = 1 @admin.register(User) class UserAdmin(admin.ModelAdmin): inlines = [SentTransactionInline, ReceivedTransactionInline]

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

Настройка отображения полей

Можно настроить отображение полей с помощью атрибутов fields, fieldsets или exclude. Также доступны readonly_fields для полей только для чтения:

from django.contrib import admin from .models import Category, Product class ProductInline(admin.StackedInline): model = Product fields = ['name', 'price', 'created_at'] readonly_fields = ['created_at'] extra = 1 @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): inlines = [ProductInline]

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

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