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