📝 Django

Inline-редактирование в Django Admin

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
82
🌿
Уровень
Средний
🐦 💼 ✈️

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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 130
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 81
📝

Django: Статические файлы

Статические файлы — CSS, JavaScript, изображения, шрифты. Django обрабатывает их особым образом: в разработке раздаёт...

📅 30.06.2026 👁️ 71

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!