Программы
Панель администрирования 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, писал и по-сложнее.

Как подключить модель к админ-панели 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.

Также может быть вам интересно:

25 января вышло новое крупное обновление Age of Empires II DE: Lords of the West

Старая добрая Age of Empires II (а точнее - Definitive Edition) получила глобальное обновление. Новые кампании, новые цивилизации!

Читать »

Панель администрирования Django - настройка вида (шаблона)

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

Читать »
Фото Python: Встроенные типы данных (list, set, dict, etc)

Python: Встроенные типы данных (list, set, dict, etc)

В Python есть множество встроенных типов данных. Их использование значительно упрощает жизнь и ускоряет разработку программных продуктов.

Фото Python: типы данных, переменные, логическое ветвление и циклы

Python: типы данных, переменные, логическое ветвление и циклы

Первая часть заметок о Python. О базовых типах, переменных, ветвлении и циклах.

Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

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

Фото Новый синтаксис старой команды with в Python 3.10

Новый синтаксис старой команды with в Python 3.10

Как же долго моё чувство прекрасного страдало… Но в Python 3.10 появился новый парсер синтаксических конструкций Python!

Фото Добавляем постраничную пагинацию на Django сайт

Добавляем постраничную пагинацию на Django сайт

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

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.