Skip to content

Latest commit

 

History

History
308 lines (195 loc) · 12.4 KB

File metadata and controls

308 lines (195 loc) · 12.4 KB

Модуль 6. Урок 34. Настройка отображения списка фильмов в админ-панели

Когда вы впервые открываете административную панель Django, создаётся ощущение, будто вы заглянули внутрь скрытой части своего проекта. Здесь можно управлять данными, моделями, пользователями — и именно в этот момент часто возникает желание сделать админку максимально удобной. Ведь если ваш проект растёт, работать с «сырым» списком записей становится всё сложнее.

В этом уроке мы научимся настраивать отображение списков моделей на примере проекта cinemahub, где у нас уже есть модель фильмов, категорий и другие сущности. Мы будем работать с моделью Movie, но при желании студент сможет повторить те же шаги для любой другой модели.

Основная задача урока — сделать список фильмов в админ-панели удобным, информативным и понятным. Это важный навык, который пригодится в каждом реальном Django-проекте.


1. Подготовка данных: что отображаем в админке

Предположим, у нас есть следующая модель фильма:

class Movie(models.Model):
    title = models.CharField(max_length=255, verbose_name="Название")
    description = models.TextField(blank=True, verbose_name="Описание")
    release_year = models.PositiveIntegerField(verbose_name="Год выпуска")
    is_published = models.BooleanField(default=True, verbose_name="Опубликовано")
    category = models.ForeignKey(
        'Category',
        on_delete=models.PROTECT,
        related_name='movies',
        verbose_name="Категория"
    )
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Добавлено")

    class Meta:
        verbose_name = "Фильм"
        verbose_name_plural = "Фильмы"
        ordering = ['-created_at']

Теперь наша задача — сделать так, чтобы фильм в списке админки отображался красиво и удобно.


2. Базовая регистрация модели с настройками

Открываем файл cinemahub/admin.py и начинаем настройку.

Цель №1 — вывести в списке фильмов важные поля:

  • ID
  • название
  • год выхода
  • статус публикации
  • дата добавления

Создаём класс администратора:

from django.contrib import admin
from .models import Movie

@admin.register(Movie)
class MovieAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'release_year', 'is_published', 'created_at')
    list_display_links = ('id', 'title')

Что мы только что сделали?

  • list_display — набор полей, которые будут отображаться в таблице.
  • list_display_links — по каким полям можно кликнуть для перехода на страницу редактирования.

После сохранения файла:

  1. Переходим в браузере → http://127.0.0.1:8000/admin/
  2. Открываем раздел Фильмы.
  3. Видим обновлённый список.

Если вы не видите никаких изменений — перезапустите сервер. Иногда Django «залипает» на кэше.


3. Настройка сортировки

По умолчанию Django сортирует записи по первичному ключу. Это не всегда удобно.

Допустим, мы хотим сортировать фильмы:

  • сначала по году выхода,
  • затем по названию.

Добавляем:

ordering = ['-release_year', 'title']

Теперь последние фильмы отображаются первыми.

Проверка:

Обновляем страницу списка фильмов — порядок изменился.


4. Дополняем список локализованными полями

Хотим, чтобы вместо «is published» отображалось «Опубликовано»? Это уже сделано через verbose_name, но иногда поля в списке могут выводиться в сыром виде, если мы выводим методы или вычисляемые значения.

Django автоматически подставляет verbose_name внутри админки, поэтому нам важно указывать их в модели. Студент должен привыкнуть: чем аккуратнее оформлены verbose-names — тем чище будет админка.


5. Регистрация модели Category

Часто вместе со списком фильмов в админке нужны также категории:

from django.contrib import admin
from .models import Category

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')
    list_display_links = ('id', 'name')

Обновляем страницу — видим категорию в панели управления.


6. Возможность редактировать поля прямо в списке

Одно из сильнейших преимуществ Django admin — возможность редактировать поля без перехода в карточку записи.

Вы, например, хотите управлять статусом публикации фильма прямо в списке.

Добавляем:

# movies/admin.py

list_editable = ('is_published',)

Теперь:

  • поле «Опубликовано» становится редактируемым,
  • можно менять статус по нескольким фильмам сразу,
  • изменения отправляются кнопкой Сохранить.

Важно:

Поля из list_editable не могут быть в list_display_links. То есть is_published не должно быть ссылкой.

Если нарушить правило — появится ошибка:

The value of 'list_editable' cannot be in list_display_links.

Это частая ошибка новичков, обязательно объясните её студентам.


7. Отображение связанных моделей в списке

Мы уже добавили поле category в модель. Теперь можно отобразить категорию фильма прямо в списке:

list_display = ('id', 'title', 'release_year', 'category', 'is_published', 'created_at')
list_editable = ('category', 'is_published')

В админке теперь появится удобное выпадающее меню с категориями — можно менять их прямо в общем списке.


8. Настройка количества записей на странице

Если фильмов много, имеет смысл ограничить вывод:

list_per_page = 10

Теперь Django показывает только 10 записей на странице и подгружает постраничную навигацию.


9. Проверка результатов

Что должен увидеть студент?

  1. Обновлённый список фильмов.
  2. Новые колонки.
  3. Сортировка по году.
  4. Выпадающие списки категорий.
  5. Возможность редактировать публикацию.
  6. Пагинацию.

Это важный навык — настроить админку так, чтобы ей было приятно пользоваться.


10. Возможные ошибки и их причины

❌ Ошибка:

The value of 'list_editable' cannot be in list_display_links

Причина: Поле одновременно редактируемое и кликабельное.

Решение: Убираем его из list_display_links.


❌ Фильмы сортируются не так, как ожидается

Причина: В модели указано ordering в Meta, а в админке — другое.

Решение: Уточнить порядок либо в модели, либо в классе администратора.


❌ Категория не отображается в списке

Причина: Поле не добавлено в list_display.


❌ Напутали импорт моделей

Частая ошибка — неправильный импорт:

from models import Movie   # ❌ неправильно

Правильно:

from .models import Movie

❌ Вместо названий категории при выборе отображается Category object(n)

В классе-модели забыли переопределить метод str. Для решения нужно добавить метод str, который возвращает имя категории.

def __str__(self):
    return self.name

Практические задания

Задание 1

Добавьте в список фильмов поле release_year, если его ещё нет. Сделайте так, чтобы оно отображалось между названием и статусом публикации.

Задание 2

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

Задание 3

Добавьте в админку сортировку фильмов:

  • сначала по категории,
  • внутри категорий — по году выхода (по убыванию).

Задание 4

Ограничьте количество элементов на странице списком из 7 записей.

Задание 5

Добавьте вторую модель (например, Director) и выведите её в админку с:

  • list_display
  • list_display_links
  • собственным verbose_name

Проверьте отображение в панели администратора.


Контрольные вопросы

  1. За что отвечает параметр list_display?
  2. Можно ли сделать одно и то же поле одновременно ссылкой и редактируемым? Почему?
  3. Как включить сортировку записей в админке?
  4. Чем ordering в модели отличается от ordering в админ-классе?
  5. Для чего используется list_per_page?
  6. Что делает декоратор @admin.register?
  7. Почему важно указывать verbose_name и verbose_name_plural?
  8. Можно ли редактировать ForeignKey-поле прямо в списке?
  9. Что произойдёт, если в list_display указать поле, которого нет в модели?
  10. Что нужно сделать, чтобы изменения стали заметны в админке?

Предыдущий урок | Следующий урок