Класс TabularInline

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

Синтаксис

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

Пример

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

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

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

pythonfrom 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 добавляет две пустые строки для создания новых статей.

Пример

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

pythonfrom 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 для указания нужного поля:

pythonfrom 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,
    который подключает встроенные формы к административному интерфейсу