Комментарии (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 более удобным инструментом для управления иерархическими данными, значительно экономя время администраторов.