⚖️ Старый 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 строки достаточно, меньше шума