📖 Теория: Django Meta, Admin, Разрешения

Краткое напоминание перед практикумом

⚡ Ключевые концепции

  • Meta: ordering, verbose_name, unique_together — настройки на уровне модели
  • choices: список кортежей или TextChoices — ограничивает допустимые значения поля
  • Admin: @admin.register, list_display, search_fields, list_filter
  • Admin-действия: методы в ModelAdmin + short_description + регистрация в actions
  • Разрешения: группы в таблице auth_group, настраиваются в Admin → Groups
  • Fixtures: dumpdata — сохранить, loaddata — восстановить

1. Класс Meta в моделях Django

Вложенный класс Meta управляет поведением модели на уровне метаданных — без влияния на структуру полей.

Ключевые опции Meta

Опция Назначение Пример
ordering Сортировка по умолчанию ['-created_at']
verbose_name Имя модели в ед. числе 'Project'
verbose_name_plural Имя модели во мн. числе 'Projects'
unique_together Уникальность по нескольким полям (('title', 'project'),)
db_table Имя таблицы в БД 'my_projects'
class Task(models.Model):
    title = models.CharField(max_length=255)
    project = models.ForeignKey('Project', on_delete=models.CASCADE)

    class Meta:
        ordering = ['-due_date']
        verbose_name = 'Task'
        verbose_name_plural = 'Tasks'
        unique_together = (('title', 'project'),)

2. Поле choices

Поле choices ограничивает допустимые значения. В исходной лекции используется список кортежей. В Django 3+ рекомендуется TextChoices.

# Вариант из практикума (список кортежей — работает в Django 5.x)
STATUSES_CHOICES = [
    ('New', 'New'),
    ('In_progress', 'In_progress'),
    ('Completed', 'Completed'),
    ('Closed', 'Closed'),
    ('Pending', 'Pending'),
    ('Blocked', 'Blocked'),
]

class Task(models.Model):
    status = models.CharField(
        max_length=15,
        choices=STATUSES_CHOICES,
        default='New'
    )
⚠️ Проверить по документации: TextChoices (Django 3+) является предпочтительным современным способом объявления choices. Список кортежей поддерживается во всех версиях Django.

3. Validators

Встроенный MinLengthValidator проверяет минимальную длину строки на уровне Django (не только в форме, но и через full_clean()).

from django.core.validators import MinLengthValidator

class Task(models.Model):
    title = models.CharField(
        max_length=255,
        unique=True,
        validators=[MinLengthValidator(10)]
    )

4. Admin-панель Django

Для каждой модели создаётся класс, унаследованный от admin.ModelAdmin. Декоратор @admin.register — современный способ регистрации.

from django.contrib import admin
from .models import Project, Task, Tag

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    list_display = ['name', 'created_at']
    search_fields = ['name']

@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
    list_display = ['title', 'project', 'status', 'priority', 'created_at', 'due_date']
    search_fields = ['title']
    list_filter = ['status', 'priority', 'project', 'created_at', 'due_date']

5. Admin-действия (actions)

Позволяют массово применять операции к выделенным объектам в списке Admin.

@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
    actions = ['change_status', 'change_priority_to_low']

    def change_status(self, request, queryset):
        queryset.update(status='Closed')
    change_status.short_description = 'Mark as Closed'

    def change_priority_to_low(self, request, queryset):
        queryset.update(priority='Low')
    change_priority_to_low.short_description = 'Mark as Low priority'
В источнике практикума использован паттерн с циклом (for obj in objects: obj.save()). Современный Django-стиль — использовать queryset.update(...) для массового обновления без лишних запросов к БД. Оба варианта корректны.

6. Property и Admin

Для отображения вычисляемых полей в Admin используют метод в ModelAdmin с short_description.

class Project(models.Model):
    files = models.ManyToManyField('ProjectFile', related_name='projects')

    @property
    def count_of_files(self):
        return self.files.count()

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    list_display = ['name', 'display_count_of_files', 'created_at']

    def display_count_of_files(self, obj):
        return obj.count_of_files
    display_count_of_files.short_description = 'Count of Files'

7. Группы разрешений

Django имеет встроенную систему разрешений. Группы создаются в Admin → Authentication and Authorization → Groups. Каждому пользователю назначается группа.

  • Флаг is_staff=True — доступ к Admin-панели
  • Флаг is_superuser=True — все разрешения без проверки
  • Группа — набор разрешений, назначается пользователю

8. Fixtures (снимки данных)

Fixtures позволяют сохранить и восстановить данные из БД без ручного заполнения.

# Сохранить группы разрешений
python manage.py dumpdata auth.Group --natural-foreign --indent=4 > fixtures/groups.json

# Восстановить из снимка
python manage.py loaddata fixtures/groups.json