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

Класс TabularInline

Класс TabularInline применяется в административной панели Django для отображения связанных объектов в виде таблицы. Он позволяет редактировать связанные модели прямо на странице родительской модели, экономя место и делая интерфейс более удобным. Основное отличие от StackedInline заключается в компактном табличном представлении полей. Класс наследуется от InlineModelAdmin и требует указания модели и количества дополнительных пустых форм.

Синтаксис

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

Пример

Давайте создадим модели категории и статьи, где статья связана с категорией через внешний ключ:

from 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

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

from django.contrib import admin from myapp.models import Category, Article class ArticleInline(admin.TabularInline): model = Article extra = 2 fields = ('title', 'published') @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display = ('name',) inlines = [ArticleInline]

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

Пример

Рассмотрим более сложный пример с настройкой отображаемых полей и количества форм:

from django.contrib import admin from myapp.models import Author, Book class BookInline(admin.TabularInline): model = Book extra = 1 max_num = 5 min_num = 1 fields = ('title', 'year', 'is_published') readonly_fields = ('created_at',) ordering = ('-year',) @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): list_display = ('name',) inlines = [BookInline]

Здесь мы указали, что минимальное количество форм min_num=1, максимальное max_num=5, поле created_at доступно только для чтения, а книги сортируются по году в обратном порядке.

Пример

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

from django.contrib import admin from myapp.models import Product, Price class PriceInline(admin.TabularInline): model = Price fk_name = 'product' extra = 1 fields = ('price', 'currency') @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('name',) inlines = [PriceInline]

В этой модели Price может иметь несколько внешних ключей на Product, но мы явно указываем, что нужно использовать поле product для связи.

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

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