← Назад к вопросам

Что такое inline в Django admin?

2.0 Middle🔥 151 комментариев
#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Inline в Django Admin

Inline — это мощный инструмент в Django Admin, который позволяет редактировать связанные модели (через ForeignKey или ManyToMany) прямо на странице родительской модели, вместо того чтобы переходить на отдельную страницу. Это значительно улучшает пользовательский опыт при работе с иерархическими данными.

Типы Inline

В Django есть два основных типа inline:

1. InlineModelAdmin — для ForeignKey отношений:

from django.contrib import admin
from .models import Author, Book

class BookInline(admin.InlineModelAdmin):
    model = Book
    extra = 1  # количество пустых форм для добавления
    fields = ["title", "isbn", "publication_date"]

class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]
    list_display = ["name", "email"]

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book)

2. TabularInline и StackedInline — варианты отображения:

# Табличный вид (компактный)
class BookTabularInline(admin.TabularInline):
    model = Book
    extra = 1
    fields = ["title", "isbn"]

# Вертикальный вид (детальный)
class BookStackedInline(admin.StackedInline):
    model = Book
    extra = 1
    fieldsets = (
        ("Основная информация", {
            "fields": ("title", "isbn")
        }),
        ("Дополнительно", {
            "fields": ("publication_date", "pages"),
            "classes": ["collapse"]
        })
    )

Практические примеры

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 1
    readonly_fields = ["created_at", "author"]
    can_delete = True  # позволяет удалять комментарии
    max_num = 10  # максимум 10 комментариев
    min_num = 0  # минимум 0

class PostAdmin(admin.ModelAdmin):
    list_display = ["title", "author", "published_date"]
    inlines = [CommentInline]
    readonly_fields = ["created_at"]

admin.site.register(Post, PostAdmin)

Важные параметры

  • extra — количество пустых форм для добавления новых объектов
  • max_num — максимальное количество объектов для редактирования
  • min_num — минимальное количество объектов
  • can_delete — показывать ли чекбокс удаления
  • readonly_fields — поля только для чтения
  • fields/fieldsets — какие поля отображать
  • raw_id_fields — для больших выборок использовать поле поиска вместо select

Предоставленные методы

Вы можете переопределить методы для кастомного поведения:

class BookInline(admin.TabularInline):
    model = Book
    
    def get_extra(self, request, obj=None, **kwargs):
        """Динамическое количество пустых форм"""
        if obj and obj.books.count() > 5:
            return 0
        return 2
    
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        """Кастомизация выбора связанного объекта"""
        if db_field.name == "publisher":
            kwargs["queryset"] = Publisher.objects.filter(active=True)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

Когда использовать Inline

Используй:

  • Когда у вас есть отношение "один-ко-многим" (Author → Books)
  • Когда связанных объектов немного (до 10-20)
  • Когда редактирование связанных объектов критично для основного объекта

Избегай:

  • Слишком большого количества inline (более 3-5) на одной странице
  • Inline для m2m отношений, если объектов много
  • Сложной логики в inline, используй raw_id_fields

Inline делает Django Admin более удобным инструментом для управления иерархическими данными, значительно экономя время администраторов.