Сьогодні нас чекає найцікавіше — практична робота з інтерфейсом адміністрування 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.
Підсумок
Ми значно покращили адмін-зону, зробили її зручною для роботи з проєктом, додали кастомні дії, налаштували відображення полів і груп доступу. Тепер наш адмін-інтерфейс виглядає професійно та структуровано. Ви можете застосовувати ці підходи у всіх своїх проєктах!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ