Inline позволяет редактировать связанные объекты прямо на странице родительского объекта.
TabularInline
from django.contrib import admin
from .models import Project, Task
class TaskInline(admin.TabularInline):
model = Task
extra = 1 # количество пустых форм
fields = ['title', 'status', 'priority']
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
inlines = [TaskInline]
Результат: на странице проекта появится таблица с задачами.
StackedInline
class TaskInline(admin.StackedInline):
model = Task
extra = 0
fields = ['title', 'description', 'status']
show_change_link = True # ссылка на страницу редактирования
StackedInline отображает каждый объект блоком, TabularInline — строкой таблицы.
Настройки Inline
class TaskInline(admin.TabularInline):
model = Task
extra = 0
max_num = 10 # максимум объектов
min_num = 1 # минимум
can_delete = True
readonly_fields = ['created_at']
extra = 0 — убрать пустые формы
По умолчанию extra = 3 — Django показывает три пустые формы для добавления новых объектов. Это часто захламляет интерфейс. Устанавливай extra = 0 если пользователь редко добавляет связанные объекты:
class TaskInline(admin.TabularInline):
model = Task
extra = 0 # без пустых форм — добавление через кнопку "Добавить ещё"
can_delete = False — запрет удаления
Если удаление связанных объектов через Admin нежелательно — отключи чекбоксы удаления:
class TaskInline(admin.TabularInline):
model = Task
extra = 0
can_delete = False # убирает колонку с чекбоксом "Удалить"
Полезно когда задачи должны удаляться только через отдельный интерфейс или мягким удалением.
max_num — ограничение количества
max_num ограничивает сколько связанных объектов можно добавить через inline. Когда лимит достигнут, кнопка «Добавить ещё» исчезает:
class TaskInline(admin.TabularInline):
model = Task
extra = 0
max_num = 5 # не больше 5 задач на проект через этот интерфейс
readonly_fields в Inline
Работает так же как в обычном ModelAdmin. Удобно для полей типа created_at, slug, или вычисляемых значений:
class TaskInline(admin.TabularInline):
model = Task
extra = 0
fields = ['title', 'status', 'created_at']
readonly_fields = ['created_at']
Поля из readonly_fields должны быть перечислены в fields, иначе они не отобразятся.
Inline для ManyToMany
class TagInline(admin.TabularInline):
model = Task.tags.through # промежуточная таблица
extra = 1
Типичная ошибка: неверное направление связи
Inline регистрируется на родительской модели — той, на которую ссылается ForeignKey другой модели.
class Task(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
Здесь Task ссылается на Project. Значит TaskInline регистрируется в ProjectAdmin — не наоборот:
# ПРАВИЛЬНО: TaskInline внутри ProjectAdmin
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
inlines = [TaskInline]
# НЕПРАВИЛЬНО: нельзя поставить ProjectInline в TaskAdmin с FK на Project
# Django выбросит ошибку: модель inline должна иметь FK на родительскую модель
Если нужно редактировать проект со страницы задачи — используй raw_id_fields или autocomplete_fields, но не inline в обратном направлении.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!