На предыдущей паре уроков мы познакомились с Django Admin и научились регистрировать модели. Мы также разобрались, как регистрировать модели с помощью admin.site.register() — это было действительно просто, не правда ли? Наконец, вы узнали, как подключить базовую модель без настройки, а затем начали осваивать расширенную кастомизацию с использованием класса ModelAdmin.
Сегодня мы сделаем ещё один шаг вперёд и начнём прокачивать отображение наших моделей в Django Admin. Готовьтесь: мы будем менять список полей, добавлять фильтры и искать данные прямо в панели администратора. Полный контроль над отображением данных — вот наша цель.
Изменение списка полей для отображения
Как только вы заглянули в админ-зону, могли заметить стандартный список объектов. Но базовое отображение — слишком скучно и вообще "не айс". Что, если мы хотим больше деталей? Например, мы хотим видеть конкретные поля, а не просто названия объектов. Знакомьтесь, атрибут list_display.
Приведём пример. Допустим, у нас есть следующая модель:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
publication_year = models.IntegerField()
genre = models.CharField(max_length=100)
def __str__(self):
return self.title
И мы уже зарегистрировали её в админке:
# admin.py
from django.contrib import admin
from .models import Book
admin.site.register(Book)
Теперь мы хотим отображать поля title, author и publication_year на странице списка объектов. Для этого создадим класс ModelAdmin и настроим list_display:
# admin.py
from django.contrib import admin
from .models import Book
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year')
admin.site.register(Book, BookAdmin)
После обновления страницы вы увидите, что таблица в админке показывает три колонки: "Title", "Author" и "Publication Year". Красота же, правда?
Если вы забыли про list_display, админка будет по умолчанию использовать только __str__() для отображения объектов. Обращение к list_display позволяет добавить больше подробностей.
Добавление фильтров
Когда у вас есть много данных, найти что-то конкретное вручную — боль. Настоящая боль. Как вы думаете, что делает админка в этом случае? Конечно же, добавляет фильтры! Для этого мы используем атрибут list_filter.
Вернёмся к нашей модели Book. Предположим, мы хотим фильтровать книги в админке по жанру и году публикации. Настроим фильтры:
# admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year')
list_filter = ('genre', 'publication_year')
admin.site.register(Book, BookAdmin)
Теперь в правой части интерфейса админки появится панель фильтров. Вы можете выбирать книги по жанрам и годам публикации. Вуаля! И никаких SQL-запросов вручную — Django сделает за нас всю тяжёлую работу.
Добавление функции поиска
Вы когда-нибудь пробовали искать иголку в стоге сена? Примерно так же работают таблицы без поиска. Но не волнуйтесь: админка снова наготове! Для поиска данных используется атрибут search_fields.
Поиск работает через SQL-запросы и поддерживает поиск по текстовым полям, таким как CharField, TextField и т.д.
Добавим возможность поиска книг по названию и автору:
# admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year')
list_filter = ('genre', 'publication_year')
search_fields = ('title', 'author')
admin.site.register(Book, BookAdmin)
На странице списка объектов появится строка поиска. Введите, например, «Диккенс», и все книги автора сразу всплывут на экране.
Кастомизация методов отображения
Вот мы и добрались до творческого этапа! Вместо стандартного отображения полей, мы можем добавить форматирование, выполнить вычисления или показать что-то необычное. Для этого используются кастомные методы.
Допустим, мы хотим добавить колонку, показывающую когда книга была издана — более 50 лет назад или нет. Создадим для этого специальный метод:
# admin.py
from datetime import datetime
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year', 'is_vintage')
def is_vintage(self, obj):
# Проверяем, издана ли книга более 50 лет назад
return datetime.now().year - obj.publication_year > 50
is_vintage.short_description = 'Винтажное издание' # Название колонки
is_vintage.boolean = True # Отображать как галочку
admin.site.register(Book, BookAdmin)
Порядок объектов в списке
Вы когда-нибудь задавались вопросом: "Почему мои данные показываются в случайном порядке?" Причина простая: SQL не сортирует данные автоматически. В админке Django это легко исправить с помощью атрибута ordering.
Допустим, мы хотим, чтобы книги располагались от новых к старым (по году публикации):
# admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year')
list_filter = ('genre', 'publication_year')
search_fields = ('title', 'author')
ordering = ('-publication_year',) # Знак минуса означает сортировку по убыванию
admin.site.register(Book, BookAdmin)
Теперь самые новые книги всегда будут отображаться первыми в списке. Просто и удобно!
Поля только для чтения
Иногда мы не хотим, чтобы пользователи могли изменять определённые поля. Например, дату создания записи. Для этого используется атрибут readonly_fields.
Добавим поле created_at в модель Book, сделаем его только для чтения:
# models.py
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
publication_year = models.IntegerField()
genre = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True) # Добавлено поле
def __str__(self):
return self.title
# admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publication_year', 'created_at')
readonly_fields = ('created_at',)
admin.site.register(Book, BookAdmin)
Теперь вы сможете видеть значение поля created_at, но не сможете его изменять. Это защитит вашу базу от случайных ошибок.
Подводные камни и полезные советы
Работа с отображением моделей в админке кажется простой, но есть несколько нюансов.
Во-первых, избегайте перегружать список колонок в list_display. Старайтесь оставлять только поля, которые действительно нужны. В противном случае таблица станет неудобной для просмотра.
Во-вторых, будьте аккуратны с большими объёмами данных. Если у вас миллионы записей, использование фильтров и поиска может замедлить админку. В таких случаях подумайте об оптимизации запросов, например, через индексы в базе данных.
Теперь вы знаете, как кастомизировать отображение моделей в Django Admin. Мы научились добавлять колонки, фильтры, поиск и кастомные методы, а также ограничивать доступ к редактированию. В следующем уроке мы разберём ModelAdmin глубже и научимся ещё более крутым трюкам. 🚀
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ