📖 Теория: Модели и админ-панель

⚡ Кратко

  • __str__ — возвращает строку, которая представляет объект в Admin и print()
  • Meta — вложенный класс с метаданными: db_table, ordering, verbose_name и др.
  • ModelAdmin — класс настройки отображения модели в Admin
  • list_display — столбцы в списке объектов, search_fields — поля для поиска
  • @admin.register(Model) — современный способ регистрации (Django 5.x)

1. Метод __str__ в Django

Полезно знать — Метод __str__: используется для определения строкового представления объектов модели. Возвращает строку, которая представляет объект модели.

Магический метод __str__ возвращает строку, которая представляет объект модели. Обычно в этом методе возвращают важное или уникальное поле, которое поможет однозначно идентифицировать объект.

Без метода __str__ объекты в административной панели отображаются как Book object (1), Book object (2) и т.д. — это неинформативно. После добавления метода отображение становится читаемым.

Пример: модель Book с __str__

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return f"{self.title} by {self.author}"

Теперь при добавлении книг через Admin и при печати они отображаются как:

  • 1984 by George Orwell
  • Pride and Prejudice by Jane Austen
  • Moby-Dick by Herman Melville

Почему важен метод __str__

  1. Удобство отображения в административной панели: Admin использует __str__ для отображения объектов. Без него — "ModelName object (1)".
  2. Улучшение читаемости логов и сообщений об ошибках: при отладке легко понять, какой именно объект был использован.
  3. Читаемость в консольных и других текстовых выводах: при использовании print() или Django shell.

2. Класс Meta

Полезно знать — Класс Meta: используется для добавления мета-данных в модели. Они помогают контролировать поведение моделей.

Класс Meta — вложенный класс внутри модели Django. Мета-данные помогают контролировать поведение модели: задавать имя таблицы, порядок сортировки, человекочитаемые имена и другие параметры.

Основные атрибуты класса Meta

АтрибутНазначение
db_table Задает имя таблицы в БД (по умолчанию Django генерирует как <app>_<model>)
ordering Определяет порядок сортировки записей. Префикс - — по убыванию
verbose_name Человекочитаемое имя модели (ед. число)
verbose_name_plural Человекочитаемое множественное число имени модели
get_latest_by Задает поле, по которому определяется последняя запись (используется с DateField/DateTimeField)
default_related_name Определяет имя обратной связи для ForeignKey и других связанных полей
unique_together Задает комбинации полей, которые должны быть уникальными. Устарело в Django 4.2+ — используйте constraints
indexes Список индексов для модели — более гибкий способ по сравнению с db_index=True
constraints Список ограничений на уровне базы данных (UniqueConstraint, CheckConstraint)

Пример использования класса Meta

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    class Meta:
        db_table = 'library_book'          # Имя таблицы в БД
        ordering = ['-published_date']     # Сортировка по убыванию даты
        verbose_name = 'fiction book'      # Имя в ед. числе
        verbose_name_plural = 'fiction books'  # Имя во мн. числе
        unique_together = ('title', 'author')  # Устарело — см. constraints
        get_latest_by = 'published_date'   # Поле для latest()
        indexes = [
            models.Index(fields=['title', 'author']),
            models.Index(fields=['published_date'], name='published_idx'),
        ]
Современный подход (Django 4.2+): вместо unique_together используйте constraints с UniqueConstraint:
from django.db.models import UniqueConstraint

class Meta:
    constraints = [
        UniqueConstraint(fields=['title', 'author'], name='unique_title_author'),
    ]

Атрибут default_related_name

Определяет имя обратной связи для ForeignKey и других связанных полей:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

    class Meta:
        default_related_name = 'books'

# Использование: author.books.all() вместо author.book_set.all()

3. Административная панель Django

Полезно знать — Админка: позволяет управлять данными приложения через веб-интерфейс. Автоматически генерирует страницы для создания, чтения, обновления и удаления (CRUD) объектов модели.

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

Настройка отображения моделей (ModelAdmin)

Чтобы настроить отображение модели в Admin, создается класс, наследуемый от admin.ModelAdmin. Этот класс позволяет настроить список отображаемых полей, фильтры, поиск и многое другое.

Основные атрибуты ModelAdmin

list_display

Определяет поля, которые будут отображаться в списке объектов модели.

list_display = ('title', 'author', 'published_date')

В списке объектов модели Book будут отображаться столбцы title, author и published_date.

search_fields

Задает поля, по которым будет производиться поиск. В Admin появится строка поиска.

search_fields = ('title', 'author__name')

Если поле — внешний ключ, нужно указывать конкретное поле через __, например author__name, а не просто author.

list_filter

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

list_filter = ('author', 'published_date')

ordering

Определяет порядок сортировки объектов в Admin. Независим от Meta.ordering.

ordering = ('-author', 'title',)

fields

Определяет порядок и набор полей, отображаемых в форме редактирования объекта.

fields = ('author', 'title', 'published_date')

list_per_page

Определяет количество объектов на одной странице в списке (по умолчанию 100).

list_per_page = 25

Полный пример класса BookAdmin

from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    # Колонки в списке объектов
    list_display = ('title', 'author', 'published_date')
    # Поиск по названию и имени автора
    search_fields = ('title', 'author__name')
    # Боковые фильтры
    list_filter = ('author', 'published_date')
    # Сортировка
    ordering = ('-author', 'title',)
    # Поля в форме редактирования
    fields = ('author', 'title', 'published_date')
    # Количество записей на странице
    list_per_page = 25

# Регистрация модели с настройками
admin.site.register(Book, BookAdmin)

4. Регистрация модели в Admin

Существуют два равнозначных способа регистрации модели в Admin:

Способ 1: admin.site.register (традиционный)

from django.contrib import admin
from .models import Book

# Простая регистрация без настроек
admin.site.register(Book)

# Или с классом настроек
admin.site.register(Book, BookAdmin)

Способ 2: декоратор @admin.register (современный, рекомендуемый)

Декоратор делает код более компактным и читаемым, особенно при регистрации множества моделей:

from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'published_date')
    search_fields = ('title', 'author__name')
    list_filter = ('author', 'published_date')
    ordering = ('-author', 'title')
    fields = ('author', 'title', 'published_date')
    list_per_page = 25
Рекомендация: в Django 5.x предпочтительным считается способ с @admin.register. Оба способа работают одинаково — выбор зависит от предпочтений команды.

5. Создание суперпользователя

Для доступа к Admin нужен суперпользователь. Создаётся через команду manage.py:

python manage.py createsuperuser

Django запросит имя пользователя, email и пароль. После создания Admin доступен по адресу http://127.0.0.1:8000/admin/.

⚠️ Проверить по документации: Django 5.x добавил дополнительные настройки Admin (readonly_fields, autocomplete_fields, show_full_result_count). Полный список — в официальной документации django.contrib.admin.