Администратор модели (ModelAdmin) - это класс, который определяет, как модель будет отображаться и какие действия можно выполнять с ней в административной панели Django. Он позволяет настраивать внешний вид и поведение модели в административной панели.
Атрибуты, которые мы можем настроить внутри класса администратора:
-
list_display
- список полей, которые отображаются на странице списка объектов модели в административной панели.Если поле является ForeignKey, Django отобразит
__str()__
связанного объекта.list_display = ('field1', 'field2', 'field3')
-
list_display_links
- определяет, какое поле или поля будут использоваться в качестве ссылок для редактирования объектов на странице списка. Если вы установитеlist_display_links
, поля, указанные в этом параметре, будут представлять собой активные ссылки на страницу редактирования объекта.list_display_links = ('field1',)
-
ordering
- порядок сортировки объектов на странице списка.ordering = ('-field1', 'field2')
-
list_editable
- список полей, которые можно редактировать прямо на странице списка.list_editable = ('field1', 'field2')
-
list_per_page
- количество объектов, отображаемых на одной странице списка. Этот параметр позволяет настроить количество объектов, которые будут отображаться на странице списка, что может быть полезно при работе с большими объемами данных.list_per_page = 50
-
list_filter
- список полей, по которым можно фильтровать объекты на странице списка.list_filter = ('field1', 'field2')
Кастомные фильтры
SimpleListFilter
Один из вариантов создания кастомных фильтров это наследование от
SimpleListFilter
. Он используется, когда для фильтра, который мы хотим создать, не предусмотрено какое-то конкретное поле в модели.Процесс создания фильтра:
-
Создаём класс, который наследуется от
admin.SimpleListFilter
. -
Определяем метод
title()
: Этот метод возвращает отображаемое название фильтра. -
Определяем метод
parameter_name()
: Этот метод возвращает имя параметра фильтра, которое будет передаваться в URL-адресе. -
Определяем метод
lookups()
: Этот метод возвращает список кортежей с вариантами фильтрации. Каждый кортеж содержит два значения: (значение, отображаемое имя). -
Определяем метод
queryset()
: Этот метод фильтрует queryset модели на основе выбранных значений фильтра.
Пример:
# admin.py class MarriedFilter(admin.SimpleListFilter): title = 'Семейное положение' parameter_name = 'status' def lookups(self, request, model_admin): return [ ('married', 'Замужем'), ('single', 'Не замужем'), ] def queryset(self, request, queryset): return queryset
Добавляем кастомный фильтр, используя название класса в коллекцию
list_filter
.@admin.register(Post) class PostAdmin(admin.ModelAdmin): ... list_filter = (MarriedFilter, 'title', 'cat__name')
-
-
search_fields
- список полей, по которым можно выполнять поиск объектов.search_fields = ('field1', 'field2')
-
readonly_fields
- определяет список полей, которые будут отображаться только для чтения на странице редактирования объекта. Это может быть полезно для полей, которые не должны редактироваться в административной панели.readonly_fields = ('created_at', 'updated_at')
-
list_select_related
- определяет, какие связанные объекты будут предварительно загружены вместе с основными объектами на странице списка. Это может уменьшить количество запросов к базе данных, если вы хотите отобразить информацию о связанных объектах.list_select_related = ('foreign_key_field',)
-
actions
- Django позволяет писать и регистрировать “действия” - функции, которые вызываются с помощью списка объектов, выбранных на странице списка изменений. Документация.actions = ['custom_action']
-
exclude
- исключает указанные поля из отображения на странице редактирования объекта.exclude = ('field1', 'field2')
-
save_on_top
- дублирует блок кнопок “Сохранить” наверху страницы редактирования объекта.save_on_top = True
-
prepopulated_fields
- определяет поля, для которых значение будет автоматически создаваться на основе значений других полей - крутая штука!) работает с кириллицей.prepopulated_fields = {'slug': ('title',)}
-
filter_horizontal
иfilter_vertical
- отображает в виде горизонтального или вертикального списка на странице редактирования объекта связанные ManyToMany объекты.filter_horizontal = ('tags',)
или
filter_vertical = ('tags',)
-
inlines
- добавляет связанные объекты, которые будут отображаться на странице редактирования объекта.from django.contrib import admin from .models import Post, Category class PostInline(admin.TabularInline): # или admin.StackedInline для другого вида отображения model = Post extra = 0 # количество дополнительных форм для добавления объектов @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): inlines = [PostInline]
Чтобы настроить названия полей в админ-панели, используем опцию verbose_name в атрибутах модели:
class Category(models.Model):
title = models.CharField(..., **verbose_name='Название категории'**)
...
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰