JavaRush /Курси /Модуль 3: Django /Практична робота з Django Admin

Практична робота з Django Admin

Модуль 3: Django
Рівень 11 , Лекція 9
Відкрита

Сьогодні нас чекає найцікавіше — практична робота з інтерфейсом адміністрування Django.

Давайте розробимо повноцінну адмін-зону нашого проєкту!

🎯 Мета лекції

Навчитися створювати, налаштовувати та кастомізувати інтерфейс адміністрування для реального проєкту. Поглянемо на адмін-зону з точки зору покращення UX для кінцевого користувача (наприклад, редакторів контенту). За підсумками лекції ви зможете:

  1. Організувати адмін-зону, щоб вона працювала чітко та структуровано.
  2. Додати кастомні дії та фільтри.
  3. Оптимізувати роботу з моделями (налаштування відображення, групування полів).
  4. Керувати доступом та правами користувачів.

🛠️ Практична частина: Крок за кроком

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️⃣ Права та дозволи

У реальному проєкті важливо, щоб не всі користувачі могли отримати доступ до всього. Наприклад, редактори можуть додавати та редагувати статті, але не повинні змінювати категорії. Налаштуємо групи користувачів і права.

  1. Створіть групу «Редактори» в адмінці.
  2. Для групи увімкніть права тільки на редагування моделі Article, але не Category.
  3. Перевірте: Користувач із групи «Редактори» зможе бачити тільки статті.

Для додаткових прав можна додати власний дозвіл:

# blog/models.py
class Article(models.Model):
    ...
    class Meta:
        permissions = [
            ("can_publish_article", "Може публікувати статті"),
        ]

Тепер ви можете видавати цей дозвіл конкретним користувачам через адмінку.

💡 Корисні поради та «підводні камені»

  1. Забудьте про PERFORMANCE: адмінка не призначена для роботи з мільйонами записів. Для таких ситуацій краще використовувати кастомні інструменти.
  2. Права користувачів: не забувайте включати перевірку прав в адмінці, щоб випадково не дати доступ комусь до важливих даних.
  3. Кастомізація інтерфейсу: якщо вам недостатньо можливостей ModelAdmin, підключіть кастомні шаблони або використовуйте бібліотеки, типу Django Grappelli.

Підсумок

Ми значно покращили адмін-зону, зробили її зручною для роботи з проєктом, додали кастомні дії, налаштували відображення полів і груп доступу. Тепер наш адмін-інтерфейс виглядає професійно та структуровано. Ви можете застосовувати ці підходи у всіх своїх проєктах!

3
Опитування
Фільтри і пошук в адмін-зоні, рівень 11, лекція 9
Недоступний
Фільтри і пошук в адмін-зоні
Фільтри і пошук в адмін-зоні
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ