← К оглавлению урока

⚖️ Старый vs Новый: Django Admin — эволюция подходов

⚡ Главные отличия

  • admin.site.register(Model, Admin)@admin.register(Model)
  • Атрибут на функции fn.short_description → декоратор @admin.action(description=...)
  • Передача self как первого параметра action → позиционный параметр modeladmin

1. Регистрация модели в Admin

Из лекции (старое)

# admin.py — явная регистрация
from django.contrib import admin
from .models import Book, Publisher

class BookInline(admin.TabularInline):
    model = Book
    extra = 1

class PublisherAdmin(admin.ModelAdmin):
    inlines = [BookInline]

# Два отдельных вызова
admin.site.register(Publisher, PublisherAdmin)
admin.site.register(Book)

Современное (Django 3.7+, Django 5.x)

# admin.py — декоратор @admin.register
from django.contrib import admin
from .models import Book, Publisher

class BookInline(admin.TabularInline):
    model = Book
    extra = 1

@admin.register(Publisher)  # регистрация через декоратор
class PublisherAdmin(admin.ModelAdmin):
    inlines = [BookInline]

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publisher']
Почему лучше @admin.register? Декоратор связывает класс и модель наглядно, уменьшает boilerplate, исключает случайную регистрацию без класса Admin.

2. Пользовательские Admin Actions

Из лекции (старое)

class BookAdmin(admin.ModelAdmin):
    def update_created_at(self, request, queryset):
        queryset.update(created_at=timezone.now())

    # short_description — атрибут функции
    update_created_at.short_description = \
        "Update created_at to current time"

    actions = [update_created_at]

Современное (Django 3.2+, Django 5.x)

from django.contrib import admin

# Самостоятельная функция + декоратор
@admin.action(description="Update created_at to current time")
def update_created_at(modeladmin, request, queryset):
    queryset.update(created_at=timezone.now())

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    actions = [update_created_at]
Преимущество нового стиля: action-функция может быть переиспользована в нескольких ModelAdmin классах, код более модульный.

3. Способы задать short_description

СпособВерсия DjangoСтатус
fn.short_description = "..." Все версии Работает, но устаревший стиль
@admin.action(description="...") 3.2+ Рекомендуемый в Django 5.x

4. Именование параметра action-функции

СтильПараметрыПримечание
Метод класса (из лекции) self, request, queryset self — ссылка на ModelAdmin
Свободная функция (современный) modeladmin, request, queryset По convention называется modeladmin
⚠️ Проверить по документации: оба стиля (метод класса и отдельная функция) работают в Django 5.x. Различие — в читаемости и переиспользуемости, не в функциональности.

5. Inline: extra=3 по умолчанию vs explicit extra=1

Неявное (плохая практика)

class BookInline(admin.TabularInline):
    model = Book
    # extra не задан → по умолчанию 3
    # Django покажет 3 пустые строки

Явное (хорошая практика)

class BookInline(admin.TabularInline):
    model = Book
    extra = 1  # всегда явно задавать
    # 1 строки достаточно, меньше шума