null

Django admin

Зачем это нужно?

Django предоставляет встроенный админский интерфейс "из коробки". Он представляет из себя CRUD для django-моделей с возможностью внедрения дополнительных функций. Пример дефолтных интерфейсов списка объектов и просмотра конкретного объекта для конкретной модели:

При желании внешний вид интерфейса можно кастомизировать

Как реализовать?

Для использования к Django-приложению нужно подключить модуль django.contrib.admin. В нем содержатся все необходимые классы, функции и декораторы, основные из которых:

  • Класс admin.ModelAdmin: базовый класс для задания параметров отображения моделей в админском интерфейсе
  • Функция admin.site.register: функция для регистрации моделей в админском интерфейсе
  • Декоратор @admin.register: альтернатива функции register 

Пример регистрации модели:

@admin.register(CourseEnrollment)
class CourseEnrollmentAdmin(admin.ModelAdmin):
    list_display = ('id', 'course_id', 'mode', 'user', 'is_active',)
    list_filter = ('mode', 'is_active',)
    search_fields = ('course__id', 'mode', 'user__username',)

Как можно заметить, в полях класса заданы те самые параметры отображения модели. В приведенном примере используются параметры для отображения списка объектов заданной модели:

  • list_display - список полей модели для отображения
  • list_filter - список полей, по которым можно будет осуществлять фильтрацию
  • search_fields - список полей модели, участвующих в поиске по запросу

Другими полезными параметрами могут быть:

  • fields - поля для отображения при переходе на страницу для конкретного объекта(по умолчанию содержит все поля)
  • exclude - альтернатива fields, только указывать поля нужно для их исключения
  • fieldsets - используется для группировки полей при их отображении для конкретного объекта
  • sortable_by - поля с возможностью сортировки по ним (по умолчанию это все поля)
  • list_per_page - сколько объектов отображать на одной странице таблицы
  • form - используется для задания кастомной формы редактирования объекта

Более подробно о создании формы редактирования: форма - класс, наследующийся от  forms.ModelForm, в котором можно указать список полей с возможностью редактирования. Пример модели Person, в которой нельзя редактировать поле name: 

from django import forms
from django.contrib import admin
from myapp.models import Person

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
        exclude = ['name']

class PersonAdmin(admin.ModelAdmin):
    form = PersonForm