Чтобы начать работать с админ-панелью 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.