Программы
Панель администрирования Django - подключение, настройка, поиск, фильтрация

Панель администрирования Django - подключение, настройка, поиск, фильтрация

Простой способ подключить админку к сайту на Django, как сконфигурировать адмиин-панель и добавить функциональность поиска, массовых действий, как изменить оформление администраторской панели Django фреймворка.

Чтобы начать работать с админ-панелью Django, нужно, как минимум создать модель данных, которую мы будем администрировать. Поэтому сначала давайте определимся с моделью, для которой мы будем писать админку:

# application/models.py

class PostModel(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False, verbose_name='Название')
    description = models.TextField(verbose_name='Описание')
    create_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
    views = models.PositiveIntegerField(default=0, verbose_name='Просмотров')
    is_visible = models.BooleanField(default=False, db_index=True, verbose_name='Не прятать')

Как можно увидеть, это довольно простая модель для описания заметок / публикаций на сайте. Думаю, каждый, кто писал хотя бы один проект на Django, писал и по-сложнее.

Изображение Python 3.11. Что нового?

Как подключить модель к админ-панели Django в пару строк

Рядом с models.py файлом можно увидеть admin.py. Именно там идёт и подключение модели к админке:

from django.contrib import admin

from .models import PostModel

admin.site.register(PostModel)

И это уже даёт возможность редактировать объекты модели PostModel из панели администрирования!

Как создать администратора и войти в админ-панель Django

Для начала проверьте в settings.py переменную INSTALLED_APPS - среди подключённых приложений должны быть:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    'application.apps.ApplicationConfig',
]

То есть должны быть джанговские приложения для аутентификации пользователей и для администрирования. А также необходимо подключить ваше приложение, чтобы обнаружился файл админки.

Также необходимо создать супер-пользователя - администратора Django-приложения. Для этого есть специальная команда в ./manage.py:

$ python ./manage.py createsuperuser
Имя пользователя (leave blank to use 'admin'): root
Адрес электронной почты: root@localhost
Password:
Password (again):
Введённый пароль слишком широко распространён.
Bypass password validation and create user anyway? [y/N]:
Password:
Password (again):
Error: Your passwords didn't match.
Password:
Password (again):
Superuser created successfully.

Как вы могли заметить, Django проверит на защищённость ваш пароль, а также на опечатки.

После создания администратора админки можно войти и в саму панель администрирования. Она находится по адресу http://127.0.0.1:8000/admin , если вы не меняли этот адрес в project/urls.py.

"Русификация" административной панели Django

Если при описании модели вы указывали параметр поля verbose_name, то оно будет использоваться и в админке при выводе label-а (названия) поля. Равно как и при выводе ModelForm, если вы решите использовать django.forms.ModelForm для генерации формы для заполнения модели.

# application/models.py

class PostModel(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False, **verbose_name='Название'**)
    description = models.TextField(**verbose_name='Описание'**)
    create_at = models.DateTimeField(auto_now_add=True, **verbose_name='Дата создания'**)
    views = models.PositiveIntegerField(default=0, **verbose_name='Просмотров'**)
    is_visible = models.BooleanField(default=False, db_index=True, **verbose_name='Не прятать'**)

Также советую указать в Meta перевод названия модели, а в def __str__(self) описать, как будут выводиться названия объектов в администрационной панели:

class PostModel(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False, verbose_name='Название')
    ...
    class Meta:
        verbose_name = 'Объявление'
        verbose_name_plural = 'Объявления'

    def __str__(self):
        return self.name

Сам же перевод интерфейса панели администрировани Django настраивается в settings.py:

LANGUAGE_CODE = 'ru'

С данными настройками ваш интерфейс админки будет выводиться на русском языке.

Добавляем ссылку "смотреть на сайте" для страниц редактирования моделей

На странице редактирования записи в верхнем правом углу можно заметить "кнопку" "История", где вы можете просматривать историю изменений данной записи.

Помимо неё есть возможность "бесплатно" получить кнопку "Смотреть на сайте", чтобы можно было перейти к отображению данного объекта на сайте. Для этого нужно добавить метод get_absolute_url в модель:

from django.db import models
from django.urls import reverse


class PostModel(models.Model):
    ...

    def get_absolute_url(self):
        return reverse('post', kwargs={'id': self.id})

То есть нужно вернуть относительный url-адрес для страницы, на которой данный объект отображается. Если данный url определён в urls.py с указанным name - можете использовать reverse, чтобы при смене шаблона url не пришлось менять код в модели.

Добавляем поля в список и сортировку по полю в панель администрирования Django

Если на вашем сайте стало достаточно много объектов модели (записей), становится сложно найти среди них нужную. Как один из вариантов - можно добавить сортировку в списке объектов по какому-либо полю (лучше иметь на нём индекс базы данных, чтобы операция была менее долгой). Например, в нашей модели можно добавить сортировку по количеству просмотров, чтобы знать: какие из заметок наиболее популярны.

Для этого заменяем наше предыдущее простое объявление админки модели на:

from django.contrib import admin

from .models import PostModel

# admin.site.register(PostModel)
@admin.register(PostModel)
class PostAdmin(admin.ModelAdmin):
    list_display = ['name', 'create_at', 'views', 'is_visible']
    ordering = ('-create_at',)

В атрибуте list_display мы объявляем список полей, которые будут выводиться в списке объектов данной модели. Кликнув по заголовку, можно отсортировать по данному полю.

Также мы задали аттрибут ordering - это поле, по которому по умолчанию будет сортироваться данный список.

Добавляем поиск по содержимому поля в админку модели

Также, чтобы не искать во множестве записей нужную, может помочь поиск по одному из полей. В нашем случае логично будет добавить возможность поиска по подстроке названия записи:

@admin.register(PostModel)
class PostAdmin(admin.ModelAdmin):
    ...
    search_fields = ['name']

Опять же, всё довольно просто и дёшево - достаточно добавить ещё один атрибут в класс админ-панели, и мы получаем сверху поле для поиска по слову/фразе, который отсеет из этой модели только нужные объекты.

Фильтруем по полю в Django админ-панели

Помимо сортировки и поиска можно добавить фильтрацию списка объектов модели по какому-то полю. Например, в нашем случае может пригодиться фильтр по полю is_visible, чтобы найти все записи, что скрыты. Также может быть интересно получить записи, что имеют пустое описание - возможно, стоит заполнить:

@admin.register(PostModel)
class PostAdmin(admin.ModelAdmin):
    ...
    list_filter = (
        ('is_visible', admin.BooleanFieldListFilter),
        ('description', admin.EmptyFieldListFilter),
    )

Всё также мы можем оставаться в рамках добавления атрибутов. Всего лишь list_filter и мы добавили 2 фильтра. Первый фильтр - BooleanFieldListFilter для фильтрации по логическим значениям (да/нет), второй - EmptyFieldListFilter для поиска пустых значений, например пустого текста.

Добавляем массовое действие над объектами модели в админ-панели

Выше списка объектов вы могли заметить выпадающий список с действиями, которые можно применить к отмеченным объектам. По умолчанию там только удаление. Однако, можно добавить и своё действие. Добавим действие, делающее видимыми выбранные заметки:

@admin.register(PostModel)
class PostAdmin(admin.ModelAdmin):
    ...
    actions = ['mark_as_visible']

    @admin.action(description='Сделать видимым')
    def mark_as_visible(self, request, queryset):
        queryset.update(is_visible=True)

В атрибуте actions перечисляем доступные действия. Для каждого действия должен быть соответствующий метод. Чтобы указать его название, оборачиваем метод в декоратор с описанием действия. Теперь в том выпадающем списке появилось ещё одно действие.

В панели администрирования Django ещё много, что можно настроить. Подробнее - в следующих заметках по Django.