JavaRush /Курсы /Модуль 3: Django /Кастомизация отображения моделей

Кастомизация отображения моделей

Модуль 3: Django
11 уровень , 2 лекция
Открыта

На предыдущей паре уроков мы познакомились с 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 глубже и научимся ещё более крутым трюкам. 🚀

1
Задача
Модуль 3: Django, 11 уровень, 2 лекция
Недоступна
Basic model customization
Basic model customization
1
Задача
Модуль 3: Django, 11 уровень, 2 лекция
Недоступна
Adding filters and search functionality
Adding filters and search functionality
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ