Сегодня нас ждет самое интересное — практическая работа с интерфейсом администрирования Django.
Давайте разработаем полноценную админ-зону нашего проекта!
🎯 Цель лекции
Научиться создавать, настраивать и кастомизировать интерфейс администрирования для реального проекта. Взглянем на админ-зону с точки зрения улучшения UX для конечного пользователя (например, редакторов контента). По итогу лекции вы сможете:
- Организовать админ-зону, чтобы она работала четко и структурировано.
- Добавить кастомные действия и фильтры.
- Оптимизировать работу с моделями (настройка отображения, группировка полей).
- Управлять доступом и правами пользователей.
🛠️ Практическая часть: Шаг за шагом
1️⃣ Регистрация моделей и базовая настройка
Начнем с регистрации моделей и минимальной их настройки. Создадим небольшое приложение blog, которое будет содержать статьи и категории.
# blog/models.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
Теперь зарегистрируем эти модели в админ-зоне:
# blog/admin.py
from django.contrib import admin
from .models import Category, Article
admin.site.register(Category)
admin.site.register(Article)
- Запустите сервер и откройте
/admin. О, добро пожаловать в вашу первую админку! Но, согласитесь, выглядит пока что всё довольно скучно.
2️⃣ Кастомизация списка объектов
Давайте добавим немного красоты и функциональности. Исправим отображение списка объектов модели Article. Используем опцию list_display, чтобы добавить больше информации.
# blog/admin.py
from django.contrib import admin
from .models import Article, Category
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'created_at') # Колонки таблицы
list_filter = ('category', 'created_at') # Боковые фильтры
search_fields = ('title', 'content') # Поля для поиска
ordering = ('-created_at',) # Сортировка
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
search_fields = ('name',)
Теперь:
- На странице списка статей вы увидите название, категорию и дату создания поста.
- Появятся боковые фильтры для категорий и дат.
- Добавится поиск по заголовкам и содержимому статей.
3️⃣ Вложенные объекты (Inline)
Мы можем ещё больше улучшить админку, добавив для редактирования категории сразу список статей. Здесь на помощь приходит TabularInline.
# blog/admin.py
class ArticleInline(admin.TabularInline):
model = Article
extra = 1 # Показывать еще одну пустую строку для добавления
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
inlines = [ArticleInline] # Вложение Article внутри Category
search_fields = ('name',)
Теперь, открыв любую категорию, вы сможете управлять всеми связанными статьями прямо из интерфейса одной формы.
4️⃣ Действия (Actions)
Иногда нам нужно массово выполнить однотипную операцию. Например, пометить несколько статей как «черновики». Добавим кастомное действие.
# blog/admin.py
def mark_as_draft(modeladmin, request, queryset):
queryset.update(title='[DRAFT] ' + queryset.first().title)
mark_as_draft.short_description = "Пометить как черновик"
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'created_at')
actions = [mark_as_draft]
Теперь выделите одну или несколько статей в списке, выберите действие, и вуаля — заголовки статей будут изменены.
5️⃣ Поля и группы на форме редактирования
При редактировании статьи мы можем сгруппировать поля для удобства. Например, используя fieldsets.
# blog/admin.py
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
...
fieldsets = (
('Основная информация', {
'fields': ('title', 'content', 'category')
}),
('Дополнительно', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',) # Скрываемый блок
}),
)
Теперь форма редактирования включает два блока, где дополнительные данные можно скрывать.
6️⃣ Права и разрешения
В реальном проекте важно, чтобы не все пользователи могли получить доступ ко всему. Например, редакторы могут добавлять и редактировать статьи, но не должны менять категории. Настроим группы пользователей и права.
- Создайте группу «Редакторы» в админке.
- Для группы включите права только на редактирование модели
Article, но неCategory. - Проверьте: Пользователь из группы «Редакторы» сможет видеть только статьи.
Для дополнительных прав можно добавить собственное разрешение:
# blog/models.py
class Article(models.Model):
...
class Meta:
permissions = [
("can_publish_article", "Может публиковать статьи"),
]
Теперь вы можете выдавать это разрешение конкретным пользователям через админку.
💡 Полезные советы и «подводные камни»
- Забудьте про PERFORMANCE: админка не предназначена для работы с миллионами записей. Для таких ситуаций лучше использовать кастомные инструменты.
- Права пользователей: не забывайте включать проверку прав в админке, чтобы случайно не дать доступ кому-то к важным данным.
- Кастомизация интерфейса: если вам недостаточно возможностей
ModelAdmin, подключите кастомные шаблоны или используйте библиотеки, вроде Django Grappelli.
Итог
Мы значительно улучшили админ-зону, сделали её удобной для работы с проектом, добавили кастомные действия, настроили отображение полей и группы доступа. Теперь наш админ-интерфейс выглядит профессионально и структурировано. Вы можете применять эти подходы во всех своих проектах!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ