Сайт администрирования Django
Одной из самых мощных частей Django является автоматический интерфейс администрирования. Он считывает метаданные из ваших моделей, чтобы предоставить быстрый, ориентированный на модели интерфейс, где авторизованные пользователи могут управлять контентом на вашем сайте. Рекомендуемое использование администрирования ограничено внутренним инструментом управления организации. Он не предназначен для построения всего вашего переднего плана вокруг него.
Администрирование имеет много крючков для кастомизации, но будьте осторожны, пытаясь использовать только эти крючки. Если вам нужно предоставить более ориентированный на процесс интерфейс, который абстрагирует детали реализации баз данных и полей, тогда, вероятно, пришло время написать собственные представления.
В этом документе мы обсуждаем, как активировать, использовать и настраивать интерфейс администрирования Django.
Обзор
Администрирование включено в шаблон проекта по умолчанию, используемый startproject.
Если вы не используете шаблон проекта по умолчанию, вот требования:
- Добавьте
'django.contrib.admin'и его зависимости -django.contrib.auth,django.contrib.contenttypes,django.contrib.messagesиdjango.contrib.sessions- в ваше значениеINSTALLED_APPS. - Настройте бэкенд
DjangoTemplatesв вашем значенииTEMPLATESсdjango.contrib.auth.context_processors.authиdjango.contrib.messages.context_processors.messagesв опции'context_processors'OPTIONS. - Если вы настраивали значение
MIDDLEWARE,django.contrib.auth.middleware.AuthenticationMiddlewareиdjango.contrib.messages.middleware.MessageMiddlewareдолжны быть включены.
После выполнения этих шагов вы сможете использовать сайт администрирования, посетив подключенный к нему URL (/admin/, по умолчанию).
Если вам нужно создать пользователя для входа, используйте команду createsuperuser. По умолчанию для входа в администрирование требуется, чтобы у пользователя было значение is_superuser или is_staff, установленное на True.
Наконец, определите, какие модели ваших приложений должны быть доступны для редактирования в интерфейсе администрирования. Для каждой из этих моделей зарегистрируйте их в администрировании, как описано в ModelAdmin.
Другие темы
- Действия в администрировании
- Генератор документации для Django администрирования
- Настройка JavaScript в администрировании
См. также
Для получения информации о передаче статических файлов (изображения, JavaScript и CSS), связанных с администрированием в продакшене, см. Передача файлов.
У вас проблемы? Попробуйте Вопросы и ответы: администрирование.
ModelAdmin объекты
-
class ModelAdmin[source] -
Класс
ModelAdminпредставляет модель в интерфейсе администрирования. Обычно они хранятся в файле с именемadmin.pyв вашем приложении. Давайте рассмотрим очень простой примерModelAdmin:from django.contrib import admin from myproject.myapp.models import Author class AuthorAdmin(admin.ModelAdmin): pass admin.site.register(Author, AuthorAdmin)Нужен ли вам объект
ModelAdminвообще?В приведенном примере класс
ModelAdminне определяет никаких пользовательских значений (еще нет). В результате, будет предоставлен интерфейс администрирования по умолчанию. Если вас устраивает интерфейс администрирования по умолчанию, вам не нужно определять объектModelAdminвообще — вы можете зарегистрировать класс модели без предоставления описанияModelAdmin. Приведенный пример можно упростить до:from django.contrib import admin from myproject.myapp.models import Author admin.site.register(Author)
Декоратор register
-
register(*models, site=django.admin.sites.site)[source] -
Также есть декоратор для регистрации ваших классов
ModelAdmin:from django.contrib import admin from .models import Author @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): passОн принимает один или несколько классов моделей для регистрации в
ModelAdmin. Если вы используете пользовательскийAdminSite, передайте его с помощью ключевого аргументаsite:from django.contrib import admin from .models import Author, Editor, Reader from myproject.admin_site import custom_admin_site @admin.register(Author, Reader, Editor, site=custom_admin_site) class PersonAdmin(admin.ModelAdmin): passВы не можете использовать этот декоратор, если вам нужно сослаться на ваш класс модели в его методе
__init__(), например,super(PersonAdmin, self).__init__(*args, **kwargs). Вы можете использоватьsuper().__init__(*args, **kwargs).
Обнаружение файлов администрирования
Когда вы помещаете 'django.contrib.admin' в ваше значение INSTALLED_APPS, Django автоматически ищет модуль admin в каждом приложении и импортирует его.
-
class apps.AdminConfig -
Это класс
AppConfigпо умолчанию для администрирования. Он вызываетautodiscover()при запуске Django.
-
class apps.SimpleAdminConfig -
Этот класс работает как
AdminConfig, за исключением того, что он не вызываетautodiscover().-
default_site -
Добавлено в Django 2.1.
Путь импорта к классу сайта администрирования по умолчанию или к вызываемой функции, которая возвращает экземпляр сайта. По умолчанию
'django.contrib.admin.sites.AdminSite'. См. Замена сайта администрирования по умолчанию для использования.
-
-
autodiscover()[source] -
Эта функция пытается импортировать модуль
adminв каждом установленных приложении. Такие модули ожидают, что они зарегистрируют модели в администрировании.Обычно вам не нужно вызывать эту функцию напрямую, так как
AdminConfigвызывает её при запуске Django.
Если вы используете пользовательский AdminSite, обычно импортируются все подклассы ModelAdmin в ваш код и регистрируются в пользовательском AdminSite. В этом случае, чтобы отключить автоматическое обнаружение, вы должны поместить 'django.contrib.admin.apps.SimpleAdminConfig' вместо 'django.contrib.admin' в ваше значение INSTALLED_APPS.
ModelAdmin параметры
ModelAdmin очень гибкий. Он имеет несколько параметров для настройки интерфейса. Все параметры определены в подклассе ModelAdmin:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
date_hierarchy = 'pub_date'
-
ModelAdmin.actions -
Список действий, которые нужно сделать доступными на странице списка изменений. Подробности см. в разделе Действия в администрировании.
-
ModelAdmin.actions_on_top
-
ModelAdmin.actions_on_bottom -
Управляет местоположением панели действий на странице. По умолчанию админ-список изменений отображает действия в верхней части страницы (
actions_on_top = True; actions_on_bottom = False).
-
ModelAdmin.actions_selection_counter -
Управляет отображением счётчика выделенных элементов рядом с выпадающим списком действий. По умолчанию, админская страница со списком изменений отображает его (
actions_selection_counter = True).
-
ModelAdmin.date_hierarchy -
Установите
date_hierarchyимя поляDateFieldилиDateTimeFieldв вашей модели, и страница списка изменений будет содержать навигацию по датам, основанную на этом поле.Пример:
date_hierarchy = 'pub_date'
Также можно указать поле связанной модели, используя поиск
__, например:date_hierarchy = 'author__pub_date'
Это будет интеллектуально заполняться на основе доступных данных, например, если все даты находятся в одном месяце, будет отображаться только детализация по дням.
Примечание
date_hierarchyиспользуетQuerySet.datetimes()внутри. Обратитесь к документации для некоторых ограничений, когда включена поддержка часовых поясов (USE_TZ = True).
-
ModelAdmin.empty_value_display -
Этот атрибут переопределяет значение по умолчанию для полей записей, которые пусты (
None, пустая строка и т.д.). Значение по умолчанию —-(тире). Например:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): empty_value_display = '-empty-'Также можно переопределить
empty_value_displayдля всех страниц админки с помощьюAdminSite.empty_value_display, или для конкретных полей так:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title', 'view_birth_date') def view_birth_date(self, obj): return obj.birth_date view_birth_date.empty_value_display = '???'
-
ModelAdmin.exclude -
Этот атрибут, если задан, должен быть списком имён полей, которые нужно исключить из формы.
Например, рассмотрим следующую модель:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3) birth_date = models.DateField(blank=True, null=True)Если вам нужна форма для модели
Author, которая включает только поляnameиtitle, вы бы указалиfieldsилиexcludeтак:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title') class AuthorAdmin(admin.ModelAdmin): exclude = ('birth_date',)Поскольку модель Author имеет только три поля,
name,title, иbirth_date, формы, полученные по этим объявлениям, будут содержать ровно те же поля.
-
ModelAdmin.fields -
Используйте опцию
fieldsдля внесения простых изменений в макет форм на страницах «добавить» и «изменить», таких как отображение только подмножества доступных полей, изменение их порядка или группировка в строки. Например, вы могли бы определить упрощённую версию админской формы для моделиdjango.contrib.flatpages.models.FlatPageследующим образом:class FlatPageAdmin(admin.ModelAdmin): fields = ('url', 'title', 'content')В приведённом выше примере будут отображаться только поля
url,titleиcontent, последовательно, в форме.fieldsможет содержать значения, определённые вModelAdmin.readonly_fields, для отображения в качестве только для чтения.Для более сложных потребностей макета см. опцию
fieldsets.Опция
fieldsпринимает те же типы значений, что иlist_display, за исключением того, что вызываемые объекты не принимаются. Имена методов модели и админа модели будут использоваться только если они указаны вreadonly_fields.Чтобы отображать несколько полей в одной строке, оберните эти поля в свои собственные кортежи. В этом примере поля
urlиtitleбудут отображаться в одной строке, а полеcontentбудет отображаться ниже их в отдельной строке:class FlatPageAdmin(admin.ModelAdmin): fields = (('url', 'title'), 'content')Примечание
Не следует путать эту опцию
fieldsс ключом словаряfields, который находится внутри опцииfieldsets, как описано в следующем разделе.Если ни опция
fieldsниfieldsetsне заданы, Django по умолчанию отобразит каждое поле, которое не являетсяAutoFieldи имеетeditable=True, в одном наборе полей в том же порядке, в котором поля определены в модели.
-
ModelAdmin.fieldsets -
Установите
fieldsetsдля управления макетом страниц администрирования «добавить» и «изменить».fieldsets— это список пар кортежей, где каждая пара кортежей представляет<fieldset>на странице админ-формы. (Набор полей — это «раздел» формы.)Пары кортежей имеют формат
(name, field_options), гдеname— строка, представляющая заголовок набора полей, аfield_options— словарь с информацией о наборе полей, включая список полей, которые должны быть отображены в нём.Полный пример, взятый из модели
django.contrib.flatpages.models.FlatPage:from django.contrib import admin class FlatPageAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('url', 'title', 'content', 'sites') }), ('Advanced options', { 'classes': ('collapse',), 'fields': ('registration_required', 'template_name'), }), )Это приводит к отображению страницы админки примерно так:
Если ни опция
fieldsetsниfieldsне заданы, Django по умолчанию отобразит каждое поле, которое не являетсяAutoFieldи имеетeditable=True, в одном наборе полей в том же порядке, в котором поля определены в модели.Словарь
field_optionsможет иметь следующие ключи:-
-
fields -
Кортеж имён полей для отображения в этом наборе полей. Этот ключ обязателен.
Пример:
{ 'fields': ('first_name', 'last_name', 'address', 'city', 'state'), }Как и с опцией
fields, чтобы отобразить несколько полей в одной строке, оберните эти поля в свои собственные кортежи. В этом примере поляfirst_nameиlast_nameбудут отображаться в одной строке:{ 'fields': (('first_name', 'last_name'), 'address', 'city', 'state'), }fieldsможет содержать значения, определённые вreadonly_fields, для отображения в качестве только для чтения.Если вы добавите имя вызываемого объекта в
fields, то применяется то же правило, что и с опциейfields: вызываемый объект должен быть указан вreadonly_fields.
-
-
-
classes -
Список или кортеж, содержащий дополнительные CSS-классы, которые нужно применить к набору полей.
Пример:
{ 'classes': ('wide', 'extrapretty'), }Два полезных класса, определённые в стиле по умолчанию админской страницы, —
collapseиwide. Наборы полей со стилемcollapseбудут изначально свёрнуты в админке и будут заменены маленькой ссылкой «нажмите, чтобы развернуть». Наборы полей со стилемwideбудут иметь дополнительный горизонтальный отступ.
-
-
-
description -
Строка с необязательным дополнительным текстом, который будет отображаться в верхней части каждого набора полей под заголовком набора полей. Эта строка не рендерится для
TabularInlineиз-за макета.Обратите внимание, что это значение не экранируется HTML при отображении в интерфейсе администрирования. Это позволяет включить HTML, если необходимо. В противном случае можно использовать обычный текст и
django.utils.html.escape()для экранирования HTML-специальных символов.
-
-
-
ModelAdmin.filter_horizontal -
По умолчанию,
ManyToManyFieldотображается в админке с<select multiple>. Однако, многовыборные поля могут быть неудобными при выборе многих элементов. ДобавлениеManyToManyFieldв этот список вместо этого будет использовать удобный ненавязчивый JavaScript-интерфейс «фильтра», который позволяет искать среди вариантов. Невыбранные и выбранные варианты отображаются в двух полях рядом. См.filter_verticalдля использования вертикального интерфейса.
-
ModelAdmin.filter_vertical -
То же, что и
filter_horizontal, но использует вертикальное отображение интерфейса фильтра с полем невыбранных вариантов, расположенным над полем выбранных вариантов.
-
ModelAdmin.form -
По умолчанию для вашей модели динамически создаётся
ModelForm. Она используется для создания формы, отображаемой на страницах добавления/изменения. Вы можете легко предоставить собственнуюModelFormдля переопределения поведения любой формы по умолчанию на страницах добавления/изменения. В качестве альтернативы, вы можете настроить форму по умолчанию, вместо того, чтобы указывать совершенно новую, используя методModelAdmin.get_form().Пример см. в разделе Добавление пользовательской валидации в админ-панель.
Примечание
Если вы определяете атрибут
Meta.modelдляModelForm, вы также должны определить атрибутMeta.fields(или атрибутMeta.exclude). Однако, поскольку у админ-панели есть свой способ определения полей, атрибутMeta.fieldsбудет игнорироваться.Если атрибут
ModelFormбудет использоваться только для админ-панели, проще всего опустить атрибутMeta.model, так какModelAdminпредоставит правильную модель для использования. В качестве альтернативы, вы можете установитьfields = []в классеMetaдля удовлетворения валидации наModelForm.Примечание
Если ваши
ModelFormиModelAdminоба определяют опциюexclude, тогдаModelAdminимеет приоритет: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): exclude = ['age'] form = PersonFormВ приведённом выше примере поле «age» будет исключено, но поле «name» будет включено в сгенерированную форму.
-
ModelAdmin.formfield_overrides -
Это обеспечивает быстрый и грязный способ переопределения некоторых опций
Fieldдля использования в админ-панели.formfield_overrides— это словарь, сопоставляющий класс поля с словарем аргументов, которые необходимо передать полю во время его создания.Поскольку это немного абстрактно, давайте рассмотрим конкретный пример. Наиболее распространённое использование
formfield_overrides— добавление пользовательского виджета для определённого типа поля. Представьте, что мы написалиRichTextEditorWidget, который мы хотели бы использовать для полей большого текста вместо стандартного<textarea>. Вот как мы это сделаем:from django.contrib import admin from django.db import models # Import our custom widget and our model from where they're defined from myapp.models import MyModel from myapp.widgets import RichTextEditorWidget class MyModelAdmin(admin.ModelAdmin): formfield_overrides = { models.TextField: {'widget': RichTextEditorWidget}, }Обратите внимание, что ключом в словаре является фактический класс поля, а не строка. Значение — другой словарь; эти аргументы будут переданы методу
__init__()поля формы. Подробности см. в API форм.Предупреждение
Если вы хотите использовать пользовательский виджет с полем связи (т. е.
ForeignKeyилиManyToManyField), убедитесь, что вы не включили имя этого поля вraw_id_fields,radio_fields, илиautocomplete_fields.formfield_overridesне позволит вам изменить виджет в полях связи, у которыхraw_id_fields,radio_fields, илиautocomplete_fieldsустановлены. Это потому, чтоraw_id_fields,radio_fields, иautocomplete_fieldsподразумевают собственные пользовательские виджеты.
-
ModelAdmin.inlines -
См. объекты
InlineModelAdminниже, а такжеModelAdmin.get_formsets_with_inlines().
-
ModelAdmin.list_display -
Установите
list_displayдля управления полями, отображаемыми на странице списка изменений админ-панели.Пример:
list_display = ('first_name', 'last_name')Если вы не установите
list_display, админ-сайт отобразит один столбец, который отображает__str__()каждого объекта.Существует четыре типа значений, которые могут быть использованы в
list_display:-
Имя поля модели. Например:
class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name') -
Вызываемый объект, принимающий один аргумент — экземпляр модели. Например:
def upper_case_name(obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name' class PersonAdmin(admin.ModelAdmin): list_display = (upper_case_name,) -
Строка, представляющая метод
ModelAdminмодели, принимающий один аргумент — экземпляр модели. Например:class PersonAdmin(admin.ModelAdmin): list_display = ('upper_case_name',) def upper_case_name(self, obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name' -
Строка, представляющая атрибут или метод модели (без требуемых аргументов). Например:
from django.contrib import admin from django.db import models class Person(models.Model): name = models.CharField(max_length=50) birthday = models.DateField() def decade_born_in(self): return self.birthday.strftime('%Y')[:3] + "0's" decade_born_in.short_description = 'Birth decade' class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'decade_born_in')
Некоторые особые случаи относительно
list_display:- Если поле является
ForeignKey, Django отобразит__str__()связанного объекта. -
ManyToManyFieldполя не поддерживаются, потому что это потребовало бы выполнения отдельного SQL-запроса для каждой строки в таблице. Если вам всё же нужно это сделать, предоставьте вашей модели пользовательский метод и добавьте имя этого метода вlist_display. (См. ниже дополнительные сведения о пользовательских методах вlist_display.) - Если поле является
BooleanField, Django отобразит привлекательный значок «вкл.» или «выкл.» вместоTrueилиFalse. -
Если указанная строка является методом модели,
ModelAdminили вызываемым объектом, Django по умолчанию будет HTML-экранировать вывод. Чтобы экранировать пользовательский ввод и разрешить свои неэкранированные теги, используйтеformat_html().Вот полный пример модели:
from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_name(self): return format_html( '<span style="color: #{};">{} {}</span>', self.color_code, self.first_name, self.last_name, ) class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'colored_name') - Как уже показывали некоторые примеры, при использовании вызываемого объекта, метода модели или метода
ModelAdmin, вы можете настроить заголовок колонки, добавив атрибутshort_descriptionк вызываемому объекту. -
Если значение поля
None, пустая строка или итерируемый объект без элементов, Django отобразит-(тире). Вы можете переопределить это с помощьюAdminSite.empty_value_display:from django.contrib import admin admin.site.empty_value_display = '(None)'
Также можно использовать
ModelAdmin.empty_value_display:class PersonAdmin(admin.ModelAdmin): empty_value_display = 'unknown'Или на уровне поля:
class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'birth_date_view') def birth_date_view(self, obj): return obj.birth_date birth_date_view.empty_value_display = 'unknown' -
Если указанная строка является методом модели,
ModelAdminили вызываемым объектом, возвращающим True или False, Django отобразит привлекательный значок «вкл.» или «выкл.», если вы зададите атрибут методаbooleanсо значениемTrue.Вот полный пример модели:
from django.contrib import admin from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50) birthday = models.DateField() def born_in_fifties(self): return self.birthday.strftime('%Y')[:3] == '195' born_in_fifties.boolean = True class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'born_in_fifties') -
Метод
__str__()так же допустим вlist_displayкак и любой другой метод модели, поэтому вполне допустимо сделать это:list_display = ('__str__', 'some_other_field') -
Обычно элементы
list_display, которые не являются фактическими полями базы данных, не могут быть использованы в сортировке (потому что Django выполняет всю сортировку на уровне базы данных).Однако, если элемент
list_displayпредставляет определённое поле базы данных, вы можете указать это, установив атрибутadmin_order_fieldэлемента.Например:
from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_first_name(self): return format_html( '<span style="color: #{};">{}</span>', self.color_code, self.first_name, ) colored_first_name.admin_order_field = 'first_name' class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name')Вышеупомянутое укажет Django на упорядочивание по полю
first_nameпри попытке сортировки поcolored_first_nameв админ-панели.Для указания убывающего порядка с
admin_order_fieldможно использовать префикс дефис перед именем поля. Используя приведенный выше пример, это будет выглядеть так:colored_first_name.admin_order_field = '-first_name'
admin_order_fieldподдерживает запросы по поиску для сортировки по значениям в связанных моделях. Этот пример включает колонку «Имя автора» в отображении списка и позволяет сортировать её по имени:class Blog(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Person, on_delete=models.CASCADE) class BlogAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'author_first_name') def author_first_name(self, obj): return obj.author.first_name author_first_name.admin_order_field = 'author__first_name'Выражения запросов могут использоваться в
admin_order_field. Например:from django.db.models import Value from django.db.models.functions import Concat class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def full_name(self): return self.first_name + ' ' + self.last_name full_name.admin_order_field = Concat('first_name', Value(' '), 'last_name')Новое в Django 2.1:Добавлена поддержка выражений в
admin_order_field. -
Элементы
list_displayтакже могут быть свойствами. Однако обратите внимание, что из-за того, как работают свойства в Python, установкаshort_descriptionна свойстве возможна только при использовании функцииproperty()и не с декоратором@property.Например:
class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def my_property(self): return self.first_name + ' ' + self.last_name my_property.short_description = "Full name of the person" full_name = property(my_property) class PersonAdmin(admin.ModelAdmin): list_display = ('full_name',) - Имена полей в
list_displayтакже будут отображаться в качестве CSS-классов в выводе HTML, в видеcolumn-<field_name>в каждом элементе<th>. Это можно использовать для установки ширины колонок в файле CSS, например. -
Django будет пытаться интерпретировать каждый элемент
list_displayв следующем порядке:- Поле модели.
- Вызываемый объект.
- Строка, представляющая атрибут
ModelAdmin. - Строка, представляющая атрибут модели.
Например, если у вас есть
first_nameкак поле модели и как атрибутModelAdmin, будет использоваться поле модели.
-
-
ModelAdmin.list_display_links -
Используйте
list_display_linksдля управления тем, какие поля вlist_displayдолжны быть связаны со страницей «изменение» объекта.По умолчанию страница списка изменений связывает первый столбец — первое поле, указанное в
list_display— со страницей изменения каждого элемента. Ноlist_display_linksпозволяет изменить это:- Установите его в
Noneдля отключения всех ссылок. -
Установите его в список или кортеж полей (в том же формате, что и
list_display) для преобразования столбцов в ссылки.Вы можете указать одно или несколько полей. Поскольку поля отображаются в
list_display, Django не заботится о количестве (или количестве) связанных полей. Единственное требование состоит в том, что если вы хотите использоватьlist_display_linksтаким образом, вы должны определитьlist_display.
В этом примере поля
first_nameиlast_nameбудут связаны на странице списка изменений:class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'birthday') list_display_links = ('first_name', 'last_name')В этом примере на странице списка изменений ссылок не будет:
class AuditEntryAdmin(admin.ModelAdmin): list_display = ('timestamp', 'message') list_display_links = None - Установите его в
-
ModelAdmin.list_editable -
Установите
list_editableв список имён полей модели, которые позволят редактировать на странице списка изменений. То есть, поля, указанные вlist_editableбудут отображаться как виджеты формы на странице списка изменений, позволяя пользователям редактировать и сохранять несколько строк одновременно.Примечание
list_editableвзаимодействует с несколькими другими опциями определёнными способами; вы должны учитывать следующие правила:- Любое поле в
list_editableтакже должно быть вlist_display. Вы не можете редактировать поле, которое не отображается! - Одно и то же поле не может быть указано как в
list_editable, так и вlist_display_links— поле не может быть одновременно формой и ссылкой.
Если какое-либо из этих правил нарушено, вы получите ошибку валидации.
- Любое поле в
-
ModelAdmin.list_filter -
Установите
list_filterдля активации фильтров в правом боковом меню страницы списка изменений администрирования, как показано на следующем снимке экрана:list_filterдолжен быть списком или кортежем элементов, где каждый элемент должен быть одного из следующих типов:-
имя поля, где указанное поле должно быть либо
BooleanField,CharField,DateField,DateTimeField,IntegerField,ForeignKeyилиManyToManyField, например:class PersonAdmin(admin.ModelAdmin): list_filter = ('is_staff', 'company')Имена полей в
list_filterтакже могут охватывать связи с помощью__поиска, например:class PersonAdmin(admin.UserAdmin): list_filter = ('company__name',) -
класс, унаследованный от
django.contrib.admin.SimpleListFilter, который вам нужно указать атрибутыtitleиparameter_nameи переопределить методыlookupsиqueryset, например:from datetime import date from django.contrib import admin from django.utils.translation import gettext_lazy as _ class DecadeBornListFilter(admin.SimpleListFilter): # Human-readable title which will be displayed in the # right admin sidebar just above the filter options. title = _('decade born') # Parameter for the filter that will be used in the URL query. parameter_name = 'decade' def lookups(self, request, model_admin): """ Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the human-readable name for the option that will appear in the right sidebar. """ return ( ('80s', _('in the eighties')), ('90s', _('in the nineties')), ) def queryset(self, request, queryset): """ Returns the filtered queryset based on the value provided in the query string and retrievable via `self.value()`. """ # Compare the requested value (either '80s' or '90s') # to decide how to filter the queryset. if self.value() == '80s': return queryset.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)) if self.value() == '90s': return queryset.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)) class PersonAdmin(admin.ModelAdmin): list_filter = (DecadeBornListFilter,)Примечание
Для удобства объект
HttpRequestпередается в методыlookupsиqueryset, например:class AuthDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): if request.user.is_superuser: return super().lookups(request, model_admin) def queryset(self, request, queryset): if request.user.is_superuser: return super().queryset(request, queryset)Также для удобства объект
ModelAdminпередается в методlookups, например, если вы хотите основывать поиск на доступных данных:class AdvancedDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): """ Only show the lookups if there actually is anyone born in the corresponding decades. """ qs = model_admin.get_queryset(request) if qs.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)).exists(): yield ('80s', _('in the eighties')) if qs.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)).exists(): yield ('90s', _('in the nineties')) -
кортеж, где первый элемент — имя поля, а второй — класс, унаследованный от
django.contrib.admin.FieldListFilter, например:class PersonAdmin(admin.ModelAdmin): list_filter = ( ('is_staff', admin.BooleanFieldListFilter), )Вы можете ограничить выбор связанной модели объектами, участвующими в этом отношении, используя
RelatedOnlyFieldListFilter:class BookAdmin(admin.ModelAdmin): list_filter = ( ('author', admin.RelatedOnlyFieldListFilter), )Предполагая, что
author— этоForeignKeyмоделиUser, это ограничит выборlist_filterпользователями, которые написали книгу, вместо перечисления всех пользователей.Примечание
API
FieldListFilterсчитается внутренним и может быть изменён.
Фильтры списка обычно отображаются только если у фильтра более одного выбора. Метод
has_output()фильтра управляет тем, отображается ли он или нет.Можно указать пользовательский шаблон для рендеринга фильтра списка:
class FilterWithCustomTemplate(admin.SimpleListFilter): template = "custom_template.html"См. шаблон по умолчанию, предоставляемый Django (
admin/filter.html) для конкретного примера. -
-
ModelAdmin.list_max_show_all -
Установите
list_max_show_allдля управления количеством элементов, которые могут отображаться на странице списка администрирования «Показать все». Администрирование будет отображать ссылку «Показать все» в списке изменений только в том случае, если общее количество результатов меньше или равно этому значению. По умолчанию это значение установлено в200.
-
ModelAdmin.list_per_page -
Установите
list_per_pageдля управления количеством элементов на каждой странице с постраничным отображением списка изменений администрирования. По умолчанию это значение установлено в100.
-
Установите
list_select_relatedдля того, чтобы Django использовалselect_related()при получении списка объектов на странице списка изменений администрирования. Это может сэкономить вам много баз данных запросов.Значение должно быть либо булевым значением, либо списком или кортежем. Значение по умолчанию
False.Когда значение
True,select_related()всегда будет вызываться. Когда значение установлено вFalse, Django будет проверятьlist_displayи вызыватьselect_related()если присутствует какой-либоForeignKey.Если вам нужна более точная настройка, используйте кортеж (или список) в качестве значения для
list_select_related. Пустой кортеж предотвратит вызовselect_relatedDjango. Любой другой кортеж будет передан непосредственно вselect_relatedв качестве параметров. Например:class ArticleAdmin(admin.ModelAdmin): list_select_related = ('author', 'category')вызовет
select_related('author', 'category').Если вам нужно указать динамическое значение, основанное на запросе, вы можете реализовать метод
get_list_select_related().
-
ModelAdmin.ordering -
Установите
orderingдля указания порядка сортировки списков объектов в представлениях Django admin. Это должен быть список или кортеж в том же формате, что и параметрorderingмодели.Если это не указано, Django admin будет использовать порядок сортировки по умолчанию для модели.
Если вам нужно указать динамический порядок (например, в зависимости от пользователя или языка), вы можете реализовать метод
get_ordering().
-
ModelAdmin.paginator -
Класс страниц, который будет использоваться для постраничного отображения. По умолчанию используется
django.core.paginator.Paginator. Если у пользовательского класса страниц нет такого же интерфейса конструктора, как уdjango.core.paginator.Paginator, вам также необходимо предоставить реализацию дляModelAdmin.get_paginator().
-
ModelAdmin.prepopulated_fields -
Установите
prepopulated_fieldsв словарь, сопоставляющий имена полей с полями, из которых они должны быть заполнены:class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)}При установке заданные поля будут использовать JavaScript для заполнения из присвоенных полей. Основное назначение этой функциональности — автоматическое создание значений для полей
SlugFieldиз одного или нескольких других полей. Сгенерированное значение создаётся путём конкатенации значений исходных полей, а затем преобразования этого результата в допустимый слог (например, замена пробелов дефисами, приведение ASCII букв к нижнему регистру и удаление различных английских стоп-слов, таких как «a», «an», «as» и подобных).Предварительно заполненные поля не изменяются JavaScript после сохранения значения. Обычно нежелательно, чтобы слоги изменялись (что привело бы к изменению URL объекта, если слог используется в нём).
prepopulated_fieldsне принимает поляDateTimeField,ForeignKey,OneToOneFieldиManyToManyField.
-
ModelAdmin.preserve_filters -
Администрирование теперь сохраняет фильтры на представлении списка после создания, редактирования или удаления объекта. Вы можете восстановить предыдущее поведение очистки фильтров, установив этот атрибут в
False.
-
ModelAdmin.radio_fields -
По умолчанию Django admin использует интерфейс выбора (<select>) для полей, которые являются
ForeignKeyили имеютchoicesустановленным. Если поле присутствует вradio_fields, Django будет использовать интерфейс радиокнопок вместо него. Предполагая, чтоgroup— этоForeignKeyмоделиPerson:class PersonAdmin(admin.ModelAdmin): radio_fields = {"group": admin.VERTICAL}У вас есть выбор использования
HORIZONTALилиVERTICALиз модуляdjango.contrib.admin.Не включайте поле в
radio_fields, если это неForeignKeyили у него не установленоchoices.
-
ModelAdmin.autocomplete_fields -
Новое в Django 2.0.
autocomplete_fields— это списокForeignKeyи/илиManyToManyFieldполей, которые вы хотите изменить на автодополняющие входы Select2.По умолчанию админ-панель использует интерфейс выпадающего списка (
<select>) для этих полей. Иногда вам не нужно загружать все связанные сущности для отображения в раскрывающемся списке.Ввод Select2 похож на стандартный ввод, но имеет функцию поиска, которая загружает варианты асинхронно. Это быстрее и удобнее для пользователя, если связанная модель содержит много сущностей.
Вы должны определить
search_fieldsв связанном объектеModelAdmin, потому что поиск в автодополнении использует его.Чтобы предотвратить несанкционированное раскрытие данных, пользователи должны иметь разрешение
viewилиchangeна связанный объект для использования автодополнения.Сортировка и пагинация результатов контролируются связанными
ModelAdminметодамиget_ordering()иget_paginator().В следующем примере
ChoiceAdminимеет поле автодополнения дляForeignKeyкQuestion. Результаты фильтруются по полюquestion_textи сортируются по полюdate_created.class QuestionAdmin(admin.ModelAdmin): ordering = ['date_created'] search_fields = ['question_text'] class ChoiceAdmin(admin.ModelAdmin): autocomplete_fields = ['question']Соображения производительности для больших наборов данных
Сортировка с использованием
ModelAdmin.orderingможет вызвать проблемы с производительностью, так как сортировка по большому набору данных будет медленной.Также, если ваши поля поиска включают поля, которые не индексируются в базе данных, вы можете столкнуться с плохой производительностью на очень больших таблицах.
В таких случаях рекомендуется написать собственную реализацию
ModelAdmin.get_search_results()с использованием полнотекстового индексированного поиска.Вы также можете изменить
Paginatorна очень больших таблицах, так как по умолчанию пагинатор всегда выполняетcount()запрос. Например, вы можете переопределить реализацию свойстваPaginator.count.
-
ModelAdmin.raw_id_fields -
По умолчанию админ-панель Django использует интерфейс выпадающего списка (<select>) для полей, которые
ForeignKey. Иногда вам не нужно загружать все связанные сущности для отображения в раскрывающемся списке.raw_id_fields— это список полей, которые вы хотите изменить на виджетInputдляForeignKeyилиManyToManyField:class ArticleAdmin(admin.ModelAdmin): raw_id_fields = ("newspaper",)Виджет
raw_id_fieldsInputдолжен содержать первичный ключ, если поле являетсяForeignKey, или список значений, разделенных запятыми, если поле являетсяManyToManyField. Виджетraw_id_fieldsотображает кнопку лупы рядом с полем, что позволяет пользователям искать и выбирать значение.
-
ModelAdmin.readonly_fields -
По умолчанию админ-панель отображает все поля как редактируемые. Любые поля в этом параметре (который должен быть
listилиtuple) будут отображать свои данные без изменений и не будут редактироваться; они также исключены изModelForm, используемого для создания и редактирования. Обратите внимание, что при указанииModelAdmin.fieldsилиModelAdmin.fieldsetsполя только для чтения должны быть присутствовать, чтобы отображаться (в противном случае они игнорируются).Если
readonly_fieldsиспользуется без явного указания порядка черезModelAdmin.fieldsилиModelAdmin.fieldsets, они будут добавлены в конец после всех редактируемых полей.Поле только для чтения может не только отображать данные из поля модели, но и отображать вывод метода модели или метода самого класса
ModelAdmin. Это очень похоже на то, как ведет себяModelAdmin.list_display. Это предоставляет простой способ использования интерфейса админ-панели для отображения статуса редактируемых объектов, например:from django.contrib import admin from django.utils.html import format_html_join from django.utils.safestring import mark_safe class PersonAdmin(admin.ModelAdmin): readonly_fields = ('address_report',) def address_report(self, instance): # assuming get_full_address() returns a list of strings # for each line of the address and you want to separate each # line by a linebreak return format_html_join( mark_safe('<br>'), '{}', ((line,) for line in instance.get_full_address()), ) or mark_safe("<span class='errors'>I can't determine this address.</span>") # short_description functions like a model field's verbose_name address_report.short_description = "Address"
-
ModelAdmin.save_as -
Установите
save_asдля включения функции «сохранить как новый» в формах изменения админ-панели.Обычно у объектов есть три варианта сохранения: «Сохранить», «Сохранить и продолжить редактирование» и «Сохранить и добавить ещё». Если
save_as—True, «Сохранить и добавить ещё» будет заменено кнопкой «Сохранить как новый», которая создаст новый объект (с новым ID) вместо обновления существующего.По умолчанию
save_asустановлено вFalse.
-
ModelAdmin.save_as_continue -
Когда
save_as=True, по умолчанию перенаправление после сохранения нового объекта происходит на страницу изменения этого объекта. Если вы установитеsave_as_continue=False, перенаправление будет на страницу списка изменений.По умолчанию
save_as_continueустановлено вTrue.
-
ModelAdmin.save_on_top -
Установите
save_on_topдля добавления кнопок сохранения в верхней части форм изменения админ-панели.Обычно кнопки сохранения отображаются только внизу форм. Если вы установите
save_on_top, кнопки будут отображаться как сверху, так и снизу.По умолчанию
save_on_topустановлено вFalse.
-
ModelAdmin.search_fields -
Установите
search_fieldsдля включения поля поиска на странице списка изменений админ-панели. Это должно быть задано как список имён полей, которые будут проиндексированы при вводе запроса поиска в это текстовое поле.Эти поля должны быть текстовыми полями, такими как
CharFieldилиTextField. Вы также можете выполнить поиск по связанному полюForeignKeyилиManyToManyFieldс помощью синтаксиса поиска «follow»:search_fields = ['foreign_key__related_fieldname']
Например, если у вас есть запись блога с автором, следующее определение позволит искать записи блога по адресу электронной почты автора:
search_fields = ['user__email']
Когда пользователь выполняет поиск в поле поиска админ-панели, Django разбивает запрос на слова и возвращает все объекты, содержащие каждое слово, без учёта регистра (используя
icontainsпоиск), где каждое слово должно присутствовать хотя бы в одном изsearch_fields. Например, еслиsearch_fieldsустановлено в['first_name', 'last_name']и пользователь ищетjohn lennon, Django выполнит эквивалент следующего SQL запроса:WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%') AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
Если вы не хотите использовать
icontainsв качестве поиска, вы можете использовать любой поиск, добавив его к полю. Например, вы можете использоватьexact, установивsearch_fieldsв['first_name__exact'].Обратите внимание, что из-за того, что поисковые термины разбиваются и конъюгируются, как описано ранее, поиск с помощью
exactработает только с одним поисковым словом, так как два или более слов не могут все быть точным совпадением, если все слова не одинаковые.Новое в Django 2.1:Была добавлена возможность указать поиск по полю.
Также доступны некоторые (старые) сокращения для указания поиска по полю. Вы можете добавить префикс к полю в
search_fieldsс помощью следующих символов, что эквивалентно добавлению__<lookup>к полю:Префикс Поиск ^ startswith= iexact@ searchNone icontainsЕсли вам нужно настроить поиск, вы можете использовать
ModelAdmin.get_search_results()для предоставления дополнительного или альтернативного поведения поиска.
-
ModelAdmin.show_full_result_count -
Установите
show_full_result_countдля управления отображением полного количества объектов на отфильтрованной странице админ-панели (например,99 results (103 total)). Если этот параметр установлен вFalse, вместо него отображается текст99 results (Show all).По умолчанию
show_full_result_count=Trueгенерирует запрос для выполнения подсчёта всех записей в таблице, что может быть затратно, если таблица содержит большое количество строк.
-
ModelAdmin.sortable_by -
Новое в Django 2.1.
По умолчанию страница списка изменений позволяет сортировать по всем полям модели (и вызовам, имеющим свойство
admin_order_field) указанным вlist_display.Если вы хотите отключить сортировку для некоторых столбцов, установите
sortable_byв коллекцию (например,list,tuple, илиset) подмножества изlist_display, которые вы хотите сделать сортируемыми. Пустая коллекция отключает сортировку для всех столбцов.Если вам нужно динамически указать этот список, реализуйте метод
get_sortable_by()вместо этого.
-
ModelAdmin.view_on_site -
Установите
view_on_siteдля управления отображением ссылки «Просмотреть на сайте». Эта ссылка должна перенаправлять вас на URL, где вы можете отобразить сохранённый объект.Это значение может быть либо булевым флагом, либо вызываемым объектом. Если
True(по умолчанию), будет использован метод объектаget_absolute_url()для генерации URL.Если ваша модель имеет метод
get_absolute_url(), но вы не хотите, чтобы отображалась кнопка «Просмотреть на сайте», вам нужно установитьview_on_siteнаFalse:from django.contrib import admin class PersonAdmin(admin.ModelAdmin): view_on_site = FalseЕсли это вызываемый объект, он принимает экземпляр модели в качестве параметра. Например:
from django.contrib import admin from django.urls import reverse class PersonAdmin(admin.ModelAdmin): def view_on_site(self, obj): url = reverse('person-detail', kwargs={'slug': obj.slug}) return 'https://example.com' + url
Настраиваемые параметры шаблонов
Раздел Замена шаблонов администрирования описывает, как переопределять или расширять стандартные шаблоны администрирования. Используйте следующие параметры для переопределения стандартных шаблонов, используемых представлениями ModelAdmin:
-
ModelAdmin.add_form_template -
Путь к настраиваемому шаблону, используемому
add_view().
-
ModelAdmin.change_form_template -
Путь к настраиваемому шаблону, используемому
change_view().
-
ModelAdmin.change_list_template -
Путь к настраиваемому шаблону, используемому
changelist_view().
-
ModelAdmin.delete_confirmation_template -
Путь к настраиваемому шаблону, используемому
delete_view()для отображения страницы подтверждения при удалении одного или нескольких объектов.
-
ModelAdmin.delete_selected_confirmation_template -
Путь к настраиваемому шаблону, используемому методом действия
delete_selectedдля отображения страницы подтверждения при удалении одного или нескольких объектов. См. документацию по действиям.
-
ModelAdmin.object_history_template -
Путь к настраиваемому шаблону, используемому
history_view().
-
ModelAdmin.popup_response_template -
Путь к настраиваемому шаблону, используемому
response_add(),response_change()иresponse_delete().
Методы ModelAdmin
Предупреждение
При переопределении ModelAdmin.save_model() и ModelAdmin.delete_model(), ваш код должен сохранять/удалять объект. Они не предназначены для вето, а позволяют выполнять дополнительные операции.
-
ModelAdmin.save_model(request, obj, form, change)[source] -
Метод
save_modelполучаетHttpRequest, экземпляр модели, экземплярModelForm, и булевое значение, основанное на добавлении или изменении объекта. Переопределение этого метода позволяет выполнять операции до или после сохранения. Вызовитеsuper().save_model()для сохранения объекта с помощьюModel.save().Например, чтобы прикрепить
request.userк объекту перед сохранением:from django.contrib import admin class ArticleAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.user = request.user super().save_model(request, obj, form, change)
-
ModelAdmin.delete_model(request, obj)[source] -
Метод
delete_modelполучаетHttpRequestи экземпляр модели. Переопределение этого метода позволяет выполнять операции до или после удаления. Вызовитеsuper().delete_model()для удаления объекта с помощьюModel.delete().
-
ModelAdmin.delete_queryset(request, queryset)[source] -
Новое в Django 2.1.
Метод
delete_queryset()получаетHttpRequestиQuerySetобъектов, подлежащих удалению. Переопределите этот метод, чтобы настроить процесс удаления для действия «удалить выбранные объекты» действие.
-
ModelAdmin.save_formset(request, form, formset, change)[source] -
Метод
save_formsetполучаетHttpRequest, родительский экземплярModelFormи булевое значение, основанное на добавлении или изменении родительского объекта.Например, чтобы прикрепить
request.userк каждому изменённому экземпляру модели formset:class ArticleAdmin(admin.ModelAdmin): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for obj in formset.deleted_objects: obj.delete() for instance in instances: instance.user = request.user instance.save() formset.save_m2m()См. также Сохранение объектов в formset.
-
ModelAdmin.get_ordering(request) -
Метод
get_orderingполучаетrequestв качестве параметра и должен возвращатьlistилиtupleдля сортировки, аналогично атрибутуordering. Например:class PersonAdmin(admin.ModelAdmin): def get_ordering(self, request): if request.user.is_superuser: return ['name', 'rank'] else: return ['name']
-
ModelAdmin.get_search_results(request, queryset, search_term)[source] -
Метод
get_search_resultsизменяет список отображаемых объектов на те, которые соответствуют предоставленному поисковому запросу. Он принимает запрос, набор объектов, применяющий текущие фильтры, и введённый пользователем поисковой запрос. Он возвращает кортеж, содержащий набор объектов, изменённый для реализации поиска, и булево значение, указывающее, могут ли результаты содержать дубликаты.Стандартная реализация выполняет поиск по полям, указанным в
ModelAdmin.search_fields.Этот метод можно переопределить с помощью собственного метода поиска. Например, вы можете выполнить поиск по целочисленному полю или использовать внешний инструмент, такой как Solr или Haystack. Вы должны определить, могут ли изменения набора объектов, реализованные вашим методом поиска, ввести дубликаты в результаты, и вернуть
Trueво втором элементе возвращаемого значения.Например, чтобы выполнить поиск по
nameиage, можно использовать:class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'age') search_fields = ('name',) def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) try: search_term_as_int = int(search_term) except ValueError: pass else: queryset |= self.model.objects.filter(age=search_term_as_int) return queryset, use_distinctЭта реализация более эффективна, чем
search_fields = ('name', '=age'), которая приводит к сравнениям строк для числового поля, например,... OR UPPER("polls_choice"."votes"::text) = UPPER('4')в PostgreSQL.
-
Метод
save_relatedполучаетHttpRequest, экземпляр родительскогоModelFormобъекта, список наборов форм inline и булево значение, указывающее, добавляется ли родительский объект или изменяется. Здесь вы можете выполнить операции до или после сохранения для объектов, связанных с родителем. Обратите внимание, что на данном этапе родительский объект и его форма уже сохранены.
-
ModelAdmin.get_autocomplete_fields(request) -
Новое в Django 2.0.
Метод
get_autocomplete_fields()получаетHttpRequestи должен возвращатьlistилиtupleимён полей, которые будут отображаться с виджетом автозаполнения, как описано выше в разделеModelAdmin.autocomplete_fields.
-
ModelAdmin.get_readonly_fields(request, obj=None) -
Метод
get_readonly_fieldsполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращатьlistилиtupleимён полей, которые будут отображаться как только для чтения, как описано выше в разделеModelAdmin.readonly_fields.
-
ModelAdmin.get_prepopulated_fields(request, obj=None) -
Метод
get_prepopulated_fieldsполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращатьdictionary, как описано выше в разделеModelAdmin.prepopulated_fields.
-
ModelAdmin.get_list_display(request)[source] -
Метод
get_list_displayполучаетHttpRequestи должен возвращатьlistилиtupleимён полей, которые будут отображаться на странице списка изменений, как описано выше в разделеModelAdmin.list_display.
-
ModelAdmin.get_list_display_links(request, list_display)[source] -
Метод
get_list_display_linksполучаетHttpRequestиlistилиtuple, возвращённые методомModelAdmin.get_list_display(). Он должен возвращатьNoneилиlistилиtupleимён полей на странице списка изменений, которые будут связаны с просмотром изменений, как описано в разделеModelAdmin.list_display_links.
-
ModelAdmin.get_exclude(request, obj=None) -
Метод
get_excludeполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращать список полей, как описано вModelAdmin.exclude.
-
ModelAdmin.get_fields(request, obj=None) -
Метод
get_fieldsполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращать список полей, как описано выше в разделеModelAdmin.fields.
-
ModelAdmin.get_fieldsets(request, obj=None) -
Метод
get_fieldsetsполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращать список пар из двух элементов, где каждая пара представляет собой набор полей на странице формы администратора, как описано выше в разделеModelAdmin.fieldsets.
-
ModelAdmin.get_list_filter(request)[source] -
Метод
get_list_filterполучаетHttpRequestи должен возвращать такой же тип последовательности, как и для атрибутаlist_filter.
-
Метод
get_list_select_relatedполучаетHttpRequestи должен возвращать булево значение или список, как иModelAdmin.list_select_related.
-
ModelAdmin.get_search_fields(request)[source] -
Метод
get_search_fieldsполучаетHttpRequestи должен возвращать такой же тип последовательности, как и для атрибутаsearch_fields.
-
ModelAdmin.get_sortable_by(request) -
Новое в Django 2.1.
Метод
get_sortable_by()получаетHttpRequestи должен возвращать коллекцию (например,list,tuple, илиset) имён полей, которые будут сортируемыми на странице списка изменений.Его стандартная реализация возвращает
sortable_by, если оно задано, иначе ссылается наget_list_display().Например, чтобы предотвратить сортировку одного или нескольких столбцов:
class PersonAdmin(admin.ModelAdmin): def get_sortable_by(self, request): return {*self.get_list_display(request)} - {'rank'}
-
ModelAdmin.get_inline_instances(request, obj=None)[source] -
Метод
get_inline_instancesполучаетHttpRequestи редактируемыйobjобъект (илиNoneпри добавлении) и должен возвращатьlistилиtupleобъектовInlineModelAdmin, как описано ниже в разделеInlineModelAdmin. Например, следующее возвращает inline без стандартного фильтра на основе прав добавления, изменения, удаления и просмотра:class MyModelAdmin(admin.ModelAdmin): inlines = (MyInline,) def get_inline_instances(self, request, obj=None): return [inline(self.model, self.admin_site) for inline in self.inlines]Если вы переопределяете этот метод, убедитесь, что возвращаемые inline являются экземплярами классов, определённых в
inlines, иначе вы можете столкнуться с ошибкой «Bad Request» при добавлении связанных объектов.
-
ModelAdmin.get_urls()[source] -
Метод
get_urlsдляModelAdminвозвращает URL-адреса, которые нужно использовать для данного ModelAdmin, аналогично URLconf. Поэтому вы можете расширить их, как описано в диспетчере URL:from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.my_view), ] return my_urls + urls def my_view(self, request): # ... context = dict( # Include common variables for rendering the admin template. self.admin_site.each_context(request), # Anything else you want in the context... key=value, ) return TemplateResponse(request, "sometemplate.html", context)Если вы хотите использовать макет администрирования, расширьте его от
admin/base_site.html:{% extends "admin/base_site.html" %} {% block content %} ... {% endblock %}Примечание
Обратите внимание, что пользовательские шаблоны включаются перед стандартными URL-адресами администрирования: шаблоны URL-адресов администрирования очень либеральны и будут соответствовать почти всему, поэтому обычно вы захотите добавить свои пользовательские URL-адреса перед встроенными.
В этом примере
my_viewбудет доступен по адресу/admin/myapp/mymodel/my_view/(предполагая, что URL-адреса администрирования включены по адресу/admin/.)Однако функция
self.my_view, зарегистрированная выше, страдает от двух проблем:- Она не будет выполнять проверки разрешений, поэтому она будет доступна всем.
- Она не будет предоставлять никаких заголовков, чтобы предотвратить кэширование. Это означает, что если страница извлекает данные из базы данных, и кэширующий промежуточный слой активен, страница может отображать устаревшую информацию.
Поскольку это обычно не то, что вам нужно, Django предоставляет удобную обёртку для проверки разрешений и маркировки представления как некэшируемого. Эта обёртка —
AdminSite.admin_view()(т.е.self.admin_site.admin_viewвнутри экземпляраModelAdmin); используйте её так:class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.admin_site.admin_view(self.my_view)) ] return my_urls + urlsОбратите внимание на обернутое представление в пятой строке выше:
path('my_view/', self.admin_site.admin_view(self.my_view))Это обертывание защитит
self.my_viewот несанкционированного доступа и применит декораторdjango.views.decorators.cache.never_cache(), чтобы убедиться, что он не кэшируется, если активен кэширующий промежуточный слой.Если страница кэшируется, но вы всё равно хотите выполнить проверку разрешений, вы можете передать аргумент
cacheable=TrueвAdminSite.admin_view():path('my_view/', self.admin_site.admin_view(self.my_view, cacheable=True))Представления
ModelAdminимеют атрибутmodel_admin. Другие представленияAdminSiteимеют атрибутadmin_site.
-
ModelAdmin.get_form(request, obj=None, **kwargs)[source] -
Возвращает класс
ModelFormдля использования в представлениях добавления и изменения в администрировании, см.add_view()иchange_view().Основная реализация использует
modelform_factory()для создания подклассаform, модифицированного атрибутами, такими какfieldsиexclude. Например, если вы хотите предложить дополнительные поля суперпользователям, вы можете заменить базовый форму следующим образом:class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if request.user.is_superuser: kwargs['form'] = MySuperuserForm return super().get_form(request, obj, **kwargs)Также вы можете просто вернуть пользовательский класс
ModelFormнапрямую.
-
ModelAdmin.get_formsets_with_inlines(request, obj=None)[source] -
Возвращает пары (
FormSet,InlineModelAdmin) для использования в представлениях добавления и изменения в администрировании.Например, если вы хотите отобразить определённый вложенный элемент только в представлении изменения, вы можете переопределить
get_formsets_with_inlinesследующим образом:class MyModelAdmin(admin.ModelAdmin): inlines = [MyInline, SomeOtherInline] def get_formsets_with_inlines(self, request, obj=None): for inline in self.get_inline_instances(request, obj): # hide MyInline in the add view if not isinstance(inline, MyInline) or obj is not None: yield inline.get_formset(request, obj), inline
-
ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs) -
Метод
formfield_for_foreignkeyдляModelAdminпозволяет вам переопределить стандартное поле формы для внешнего ключа. Например, чтобы вернуть подмножество объектов для этого поля внешнего ключа на основе пользователя:class MyModelAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "car": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs)Это использует экземпляр
HttpRequestдля фильтрации поля внешнего ключаCar, чтобы отобразить только те автомобили, которые принадлежат экземпляруUser.
-
ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs) -
Подобно методу
formfield_for_foreignkey, методformfield_for_manytomanyможно переопределить, чтобы изменить стандартное поле формы для поля «многие ко многим». Например, если владелец может владеть несколькими автомобилями, а автомобили могут принадлежать нескольким владельцам — отношение «многие ко многим» — вы могли бы отфильтровать поле внешнего ключаCar, чтобы отобразить только те автомобили, которые принадлежат экземпляруUser:class MyModelAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "cars": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_manytomany(db_field, request, **kwargs)
-
ModelAdmin.formfield_for_choice_field(db_field, request, **kwargs) -
Подобно методам
formfield_for_foreignkeyиformfield_for_manytomany, методformfield_for_choice_fieldможно переопределить, чтобы изменить стандартное поле формы для поля, у которого объявлены варианты. Например, если варианты, доступные суперпользователю, должны отличаться от вариантов, доступных обычным сотрудникам, вы могли бы поступить следующим образом:class MyModelAdmin(admin.ModelAdmin): def formfield_for_choice_field(self, db_field, request, **kwargs): if db_field.name == "status": kwargs['choices'] = ( ('accepted', 'Accepted'), ('denied', 'Denied'), ) if request.user.is_superuser: kwargs['choices'] += (('ready', 'Ready for deployment'),) return super().formfield_for_choice_field(db_field, request, **kwargs)Примечание
Любой атрибут
choices, установленный на поле формы, будет ограничен только этим полем. Если соответствующее поле в модели имеет заданные варианты, варианты, предоставляемые форме, должны быть допустимым подмножеством этих вариантов, в противном случае отправка формы завершится ошибкойValidationError, когда сама модель будет валидирована перед сохранением.
-
ModelAdmin.get_changelist(request, **kwargs)[source] -
Возвращает класс
Changelistдля использования при отображении списка. По умолчанию используетсяdjango.contrib.admin.views.main.ChangeList. Наследуя этот класс, вы можете изменить поведение отображения.
-
ModelAdmin.get_changelist_form(request, **kwargs)[source] -
Возвращает класс
ModelFormдля использования вFormsetна странице списка изменений. Чтобы использовать пользовательскую форму, например:from django import forms class MyForm(forms.ModelForm): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_form(self, request, **kwargs): return MyFormПримечание
Если вы определяете атрибут
Meta.modelуModelForm, вы также должны определить атрибутMeta.fields(или атрибутMeta.exclude). ОднакоModelAdminигнорирует это значение, переопределяя его атрибутомModelAdmin.list_editable. Самый простой способ — опустить атрибутMeta.model, так какModelAdminпредоставит правильную модель для использования.
-
ModelAdmin.get_changelist_formset(request, **kwargs)[source] -
Возвращает класс ModelFormSet для использования на странице списка изменений, если используется
list_editable. Чтобы использовать пользовательский набор форм, например:from django.forms import BaseModelFormSet class MyAdminFormSet(BaseModelFormSet): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_formset(self, request, **kwargs): kwargs['formset'] = MyAdminFormSet return super().get_changelist_formset(request, **kwargs)
-
ModelAdmin.lookup_allowed(lookup, value) -
Объекты на странице изменения могут быть отфильтрованы с помощью поисков из строки запроса URL. Таким образом работает
list_filter, например. Поиски похожи на те, что используются вQuerySet.filter()(например,user__email=user@example.com). Поскольку поиски в строке запроса могут быть изменены пользователем, они должны быть очищены для предотвращения несанкционированного доступа к данным.Методу
lookup_allowed()передается путь поиска из строки запроса (например,'user__email') и соответствующее значение (например,'user@example.com'), и он возвращает логическое значение, указывающее, разрешено ли фильтрация списка измененийQuerySetс использованием параметров. Еслиlookup_allowed()возвращаетFalse, возникает исключениеDisallowedModelAdminLookup(подклассSuspiciousOperation).По умолчанию
lookup_allowed()разрешает доступ к локальным полям модели, путям полей, используемым вlist_filter(но не путям изget_list_filter()), и поискам, необходимым для работыlimit_choices_toвraw_id_fields.Переопределите этот метод, чтобы настроить разрешенные поиски для вашего подкласса
ModelAdmin.
-
ModelAdmin.has_view_permission(request, obj=None) -
Новое в Django 2.1.
Должен вернуть
Trueесли просмотрobjразрешен,Falseв противном случае. Если obj равенNone, должен вернутьTrueилиFalseдля указания, разрешен ли просмотр объектов данного типа в целом (например,Falseбудет означать, что текущий пользователь не имеет разрешения на просмотр каких-либо объектов этого типа).По умолчанию реализация возвращает
Trueесли у пользователя есть разрешение "изменить" или "просмотреть".
-
ModelAdmin.has_add_permission(request) -
Должен вернуть
Trueесли добавление объекта разрешено,Falseв противном случае.
-
ModelAdmin.has_change_permission(request, obj=None) -
Должен вернуть
Trueесли редактированиеobjразрешено,Falseв противном случае. ЕслиobjравенNone, должен вернутьTrueилиFalseдля указания, разрешено ли редактирование объектов данного типа в целом (например,Falseбудет означать, что текущий пользователь не имеет разрешения на редактирование каких-либо объектов этого типа).
-
ModelAdmin.has_delete_permission(request, obj=None) -
Должен вернуть
Trueесли удалениеobjразрешено,Falseв противном случае. ЕслиobjравенNone, должен вернутьTrueилиFalseдля указания, разрешено ли удаление объектов данного типа в целом (например,Falseбудет означать, что текущий пользователь не имеет разрешения на удаление каких-либо объектов этого типа).
-
ModelAdmin.has_module_permission(request) -
Должен вернуть
Trueесли отображение модуля на странице админ-индекса и доступ к странице индекса модуля разрешены,Falseв противном случае. ИспользуетUser.has_module_perms()по умолчанию. Переопределение не ограничивает доступ к представлениям, добавлению, изменению или удалению представлений,has_view_permission(),has_add_permission(),has_change_permission()иhas_delete_permission()должны использоваться для этого.
-
ModelAdmin.get_queryset(request) -
Метод
get_querysetнаModelAdminвозвращаетQuerySetвсех экземпляров модели, которые могут быть отредактированы сайтом администрирования. Один из случаев использования переопределения этого метода — показать объекты, принадлежащие вошедшему пользователю:class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(author=request.user)
-
ModelAdmin.message_user(request, message, level=messages.INFO, extra_tags='', fail_silently=False)[source] -
Отправляет сообщение пользователю, используя бэкенд
django.contrib.messages. См. пример настраиваемого ModelAdmin.Использование ключевых аргументов позволяет изменить уровень сообщения, добавить дополнительные теги CSS или отказаться от выполнения операции без ошибок, если фреймворк
contrib.messagesне установлен. Эти ключевые аргументы соответствуют аргументам функцииdjango.contrib.messages.add_message(), см. документацию этой функции для получения дополнительной информации. Различие заключается в том, что уровень может быть передан как метка строки в дополнение к целочисленному значению/константе.
-
ModelAdmin.get_paginator(request, queryset, per_page, orphans=0, allow_empty_first_page=True)[source] -
Возвращает экземпляр пагинатора, который нужно использовать для этого представления. По умолчанию создает экземпляр
paginator.
-
ModelAdmin.response_add(request, obj, post_url_continue=None)[source] -
Определяет
HttpResponseдля стадииadd_view().response_addвызывается после отправки формы администрирования и сразу после создания и сохранения объекта и всех связанных экземпляров. Вы можете переопределить его, чтобы изменить стандартное поведение после создания объекта.
-
ModelAdmin.response_change(request, obj)[source] -
Определяет
HttpResponseдля стадииchange_view().response_changeвызывается после отправки формы администрирования и сразу после сохранения объекта и всех связанных экземпляров. Вы можете переопределить его, чтобы изменить стандартное поведение после изменения объекта.
-
ModelAdmin.response_delete(request, obj_display, obj_id)[source] -
Определяет
HttpResponseдля стадииdelete_view().response_deleteвызывается после удаления объекта. Вы можете переопределить его, чтобы изменить стандартное поведение после удаления объекта.obj_display— строка с именем удаленного объекта.obj_id— сериализованный идентификатор, используемый для извлечения объекта, который нужно удалить.
-
ModelAdmin.get_changeform_initial_data(request)[source] -
Метод для задания начальных значений на страницах редактирования в админ-панели. По умолчанию, поля получают начальные значения из параметров
GET. Например,?name=initial_valueустановит начальное значение поляnameвinitial_value.Этот метод должен возвращать словарь в формате
{'fieldname': 'fieldval'}:def get_changeform_initial_data(self, request): return {'name': 'custom_initial_value'}
-
ModelAdmin.get_deleted_objects(objs, request)[source] -
Добавлена в Django 2.1.
Метод для настройки процесса удаления объектов на странице
delete_view()и при удалении выделенных объектов через действие.Аргумент
objs— это однородный итерируемый объект (например,QuerySetили список экземпляров модели) для удаления, аrequest— этоHttpRequest.Этот метод должен возвращать 4-кортеж
(deleted_objects, model_count, perms_needed, protected).deleted_objects— это список строк, представляющих все объекты, которые будут удалены. Если существуют связанные объекты для удаления, список вложен и включает эти связанные объекты. Список отформатирован в шаблоне с использованием фильтраunordered_list.model_count— это словарь, сопоставляющийverbose_name_pluralкаждой модели с количеством удаляемых объектов.perms_needed— это множествоverbose_nameмоделей, которые у пользователя нет разрешения удалить.protected— это список строк, представляющих все защищенные связанные объекты, которые нельзя удалить. Список отображается в шаблоне.
Другие методы
-
ModelAdmin.add_view(request, form_url='', extra_context=None)[source] -
Представление Django для страницы добавления экземпляра модели. См. примечание ниже.
-
ModelAdmin.change_view(request, object_id, form_url='', extra_context=None)[source] -
Представление Django для страницы редактирования экземпляра модели. См. примечание ниже.
-
ModelAdmin.changelist_view(request, extra_context=None)[source] -
Представление Django для страницы списка экземпляров модели/действий. См. примечание ниже.
-
ModelAdmin.delete_view(request, object_id, extra_context=None)[source] -
Представление Django для страницы подтверждения удаления экземпляра(ов) модели. См. примечание ниже.
-
ModelAdmin.history_view(request, object_id, extra_context=None)[source] -
Представление Django для страницы истории изменений для данного экземпляра модели.
В отличие от методов типа ModelAdmin в предыдущем разделе, эти пять методов на самом деле предназначены для вызова как представлений Django из обработчика маршрутизации URL-адресов приложения admin для отображения страниц, которые обрабатывают операции CRUD с экземплярами модели. Полная перезапись этих методов существенно изменит поведение приложения admin.
Одной из распространенных причин перезаписи этих методов является дополнение данных контекста, которые предоставляются шаблону, отображающему представление. В следующем примере представление change перезаписывается так, что отображаемому шаблону предоставляются дополнительные данные отображения, которые в противном случае не были бы доступны:
class MyModelAdmin(admin.ModelAdmin):
# A template for a very customized change view:
change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html'
def get_osm_info(self):
# ...
pass
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['osm_data'] = self.get_osm_info()
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
Эти представления возвращают экземпляры TemplateResponse, что позволяет легко настроить данные ответа перед отображением. Для более подробной информации см. документацию TemplateResponse.
ModelAdmin определения ресурсов
Иногда необходимо добавить CSS и/или JavaScript в представления add/change. Это можно сделать, используя внутренний класс Media в вашем ModelAdmin:
class ArticleAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("my_styles.css",)
}
js = ("my_code.js",)
Приложение staticfiles добавляет STATIC_URL (или MEDIA_URL, если STATIC_URL — None) в путь к любому ресурсу. Применяются те же правила, что и при определении ресурсов в формах.
jQuery
JavaScript в Django admin использует библиотеку jQuery.
Чтобы избежать конфликтов с пользовательскими скриптами или библиотеками, jQuery Django (версия 3.3.1) использует пространство имён django.jQuery. Если вы хотите использовать jQuery в собственном JavaScript admin без включения второй копии, вы можете использовать объект django.jQuery в представлениях списка, добавления и редактирования.
jQuery был обновлён с версии 2.2.3 до 3.3.1.
Класс ModelAdmin по умолчанию требует jQuery, поэтому нет необходимости добавлять jQuery в список ресурсов media, если у вас нет специфической потребности. Например, если вам нужно, чтобы jQuery был в глобальном пространстве имен (например, при использовании сторонних плагинов jQuery) или если вам нужна более новая версия jQuery, вы должны включить собственную копию.
Django предоставляет как нескомпрессированные, так и «скомпрессированные» версии jQuery, как jquery.js и jquery.min.js соответственно.
ModelAdmin и InlineModelAdmin имеют свойство media, которое возвращает список Media объектов, которые хранят пути к файлам JavaScript для форм и/или наборов форм. Если DEBUG — True, он вернёт нескомпрессированные версии файлов JavaScript, включая jquery.js; в противном случае — «скомпрессированные» версии.
Добавление пользовательской валидации в админ-панель
Добавление пользовательской валидации данных в админ-панель довольно просто. Автоматический интерфейс admin использует django.forms, а класс ModelAdmin позволяет определять собственную форму:
class ArticleAdmin(admin.ModelAdmin):
form = MyArticleAdminForm
MyArticleAdminForm можно определить в любом месте, при условии, что вы импортируете его по мере необходимости. Теперь внутри вашей формы можно добавить собственную пользовательскую валидацию для любого поля:
class MyArticleAdminForm(forms.ModelForm):
def clean_name(self):
# do something that validates your data
return self.cleaned_data["name"]
Важно использовать здесь ModelForm для корректной работы. См. документацию по формам по пользовательской валидации и, более конкретно, примечания по валидации моделей форм для получения более подробной информации.
InlineModelAdmin объекты
-
class InlineModelAdmin
-
class TabularInline[source]
-
class StackedInline[source] -
В интерфейсе администрирования есть возможность редактировать модели на одной странице с родительской моделью. Эти элементы называются встроеными. Предположим, у вас есть две такие модели:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) title = models.CharField(max_length=100)
Вы можете редактировать книги, написанные автором, на странице автора. Вы добавляете встроенные элементы в модель, указав их в
ModelAdmin.inlines:from django.contrib import admin class BookInline(admin.TabularInline): model = Book class AuthorAdmin(admin.ModelAdmin): inlines = [ BookInline, ]Django предоставляет два подкласса
InlineModelAdminи это:Разница между ними заключается только в используемой для их отображения шаблоне.
InlineModelAdmin параметры
InlineModelAdmin разделяет многие функции с ModelAdmin, и добавляет свои собственные (общие функции на самом деле определены в суперклассе BaseModelAdmin). Общие функции:
formfieldsetsfieldsformfield_overridesexcludefilter_horizontalfilter_verticalorderingprepopulated_fieldsget_queryset()radio_fieldsreadonly_fieldsraw_id_fieldsformfield_for_choice_field()formfield_for_foreignkey()formfield_for_manytomany()has_module_permission()
Класс InlineModelAdmin добавляет или настраивает:
-
InlineModelAdmin.model -
Модель, используемая встроенным элементом. Это обязательно.
-
InlineModelAdmin.fk_name -
Имя внешнего ключа в модели. В большинстве случаев это обрабатывается автоматически, но
fk_nameнеобходимо указать явно, если существует более одного внешнего ключа к одной и той же родительской модели.
-
InlineModelAdmin.formset -
По умолчанию это
BaseInlineFormSet. Использование собственного набора форм предоставляет множество возможностей настройки. Встроенные элементы основаны на наборах форм моделей.
-
InlineModelAdmin.form -
Значение для
formпо умолчаниюModelForm. Это то, что передается вinlineformset_factory()при создании набора форм для этого встроенного элемента.
Предупреждение
При написании пользовательской проверки для форм InlineModelAdmin будьте осторожны при написании проверки, которая зависит от особенностей родительской модели. Если родительская модель не проходит проверку, она может остаться в несогласованном состоянии, как описано в предупреждении в Проверка в ModelForm.
-
InlineModelAdmin.classes -
Список или кортеж, содержащий дополнительные CSS-классы, применяемые к набору полей, отображаемых для встроенных элементов. По умолчанию
None. Как и с классами, настроенными вfieldsets, встроенные элементы с классомcollapseизначально будут свернуты, а заголовок будет содержать небольшую ссылку «Показать».
-
InlineModelAdmin.extra -
Это контролирует количество дополнительных форм, которые набор форм отобразит в дополнение к исходным формам. Подробнее см. в документации по наборам форм.
Для пользователей с браузерами, поддерживающими JavaScript, предоставляется ссылка «Добавить ещё», чтобы можно было добавить любое количество дополнительных встроенных элементов в дополнение к тем, которые отображаются в результате аргумента
extra.Динамическая ссылка не будет отображаться, если количество отображаемых форм превышает
max_num, или если пользователь не использует JavaScript.InlineModelAdmin.get_extra()также позволяет настроить количество дополнительных форм.
-
InlineModelAdmin.max_num -
Это контролирует максимальное количество форм, отображаемых во встроенном элементе. Это не напрямую коррелирует с количеством объектов, но может, если значение достаточно мало. Подробнее см. Ограничение количества редактируемых объектов.
InlineModelAdmin.get_max_num()также позволяет настроить максимальное количество дополнительных форм.
-
InlineModelAdmin.min_num -
Это контролирует минимальное количество форм, отображаемых во встроенном элементе. Подробнее см.
modelformset_factory().InlineModelAdmin.get_min_num()также позволяет настроить минимальное количество отображаемых форм.
-
InlineModelAdmin.raw_id_fields -
По умолчанию Django Admin использует интерфейс выбора (<select>) для полей, которые
ForeignKey. Иногда вы не хотите тратить ресурсы на выбор всех связанных экземпляров для отображения в выпадающем списке.raw_id_fields- это список полей, которые вы хотите изменить на виджетInputдляForeignKeyилиManyToManyField:class BookInline(admin.TabularInline): model = Book raw_id_fields = ("pages",)
-
InlineModelAdmin.template -
Шаблон, используемый для отображения встроенного элемента на странице.
-
InlineModelAdmin.verbose_name -
Переопределение
verbose_nameв внутреннем классеMetaмодели.
-
InlineModelAdmin.verbose_name_plural -
Переопределение
verbose_name_pluralв внутреннем классеMetaмодели.
-
InlineModelAdmin.can_delete -
Указывает, можно ли удалять объекты во встроенном элементе. По умолчанию
True.
-
InlineModelAdmin.show_change_link -
Указывает, будет ли для изменяемых объектов во встроенном элементе ссылка на форму изменения. По умолчанию
False.
-
InlineModelAdmin.get_formset(request, obj=None, **kwargs) -
Возвращает класс
BaseInlineFormSetдля использования в админских представлениях добавления/изменения. См. пример дляModelAdmin.get_formsets_with_inlines.
-
InlineModelAdmin.get_extra(request, obj=None, **kwargs) -
Возвращает количество дополнительных форм встроек. По умолчанию возвращает атрибут
InlineModelAdmin.extra.Переопределите этот метод, чтобы программно определить количество дополнительных форм встроек. Например, это может быть основано на экземпляре модели (переданном в качестве ключевого аргумента
obj):class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_extra(self, request, obj=None, **kwargs): extra = 2 if obj: return extra - obj.binarytree_set.count() return extra
-
InlineModelAdmin.get_max_num(request, obj=None, **kwargs) -
Возвращает максимальное количество дополнительных форм встроек. По умолчанию возвращает атрибут
InlineModelAdmin.max_num.Переопределите этот метод, чтобы программно определить максимальное количество форм встроек. Например, это может быть основано на экземпляре модели (переданном в качестве ключевого аргумента
obj):class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_max_num(self, request, obj=None, **kwargs): max_num = 10 if obj and obj.parent: return max_num - 5 return max_num
-
InlineModelAdmin.get_min_num(request, obj=None, **kwargs) -
Возвращает минимальное количество форм встроек. По умолчанию возвращает атрибут
InlineModelAdmin.min_num.Переопределите этот метод, чтобы программно определить минимальное количество форм встроек. Например, это может быть основано на экземпляре модели (переданном в качестве ключевого аргумента
obj).
-
InlineModelAdmin.has_add_permission(request, obj) -
Должен вернуть
Trueесли добавление объекта встроек разрешено,Falseв противном случае.obj— это родительский объект, который редактируется, илиNoneпри добавлении нового родителя.Изменено в Django 2.1:Аргумент
objбыл добавлен. В период устаревания он также может бытьNoneесли сторонние вызовы кhas_add_permission()не предоставят его.
-
InlineModelAdmin.has_change_permission(request, obj=None) -
Должен вернуть
Trueесли редактирование объекта встроек разрешено,Falseв противном случае.obj— это родительский объект, который редактируется.
-
InlineModelAdmin.has_delete_permission(request, obj=None) -
Должен вернуть
Trueесли удаление объекта встроек разрешено,Falseв противном случае.obj— это родительский объект, который редактируется.
Работа с моделью с двумя или более внешними ключами к той же родительской модели
Иногда возможно иметь более одного внешнего ключа к одной и той же модели. Рассмотрим такую модель:
from django.db import models
class Friendship(models.Model):
to_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="friends")
from_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="from_friends")
Если вы хотите отобразить встроенное представление на страницах администрирования добавления/изменения Person, вам необходимо явно определить внешний ключ, поскольку автоматически сделать это нельзя:
from django.contrib import admin
from myapp.models import Friendship
class FriendshipInline(admin.TabularInline):
model = Friendship
fk_name = "to_person"
class PersonAdmin(admin.ModelAdmin):
inlines = [
FriendshipInline,
]
Работа с моделями "многие ко многим"
По умолчанию, админские виджеты для отношений "многие ко многим" будут отображаться на той модели, которая содержит фактическую ссылку на ManyToManyField. В зависимости от вашего определения ModelAdmin, каждое поле "многие ко многим" в вашей модели будет представлено стандартным HTML <select multiple>, горизонтальным или вертикальным фильтром, или виджетом raw_id_admin. Однако также возможно заменить эти виджеты на встроенные представления.
Предположим, у нас есть следующие модели:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, related_name='groups')
Если вы хотите отобразить отношения "многие ко многим" с помощью встроенного представления, вы можете сделать это, определив объект InlineModelAdmin для этого отношения:
from django.contrib import admin
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
class GroupAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
exclude = ('members',)
Есть две особенности, которые стоит отметить в этом примере.
Во-первых, класс MembershipInline ссылается на Group.members.through. Атрибут through — это ссылка на модель, которая управляет отношением "многие ко многим". Эта модель автоматически создается Django при определении поля "многие ко многим".
Во-вторых, класс GroupAdmin должен вручную исключить поле <select multiple>. Django отображает админский виджет для поля "многие ко многим" в модели, которая определяет отношение (в данном случае Group). Если вы хотите использовать встроенную модель для представления отношения "многие ко многим", вы должны сообщить Django, чтобы он не отображал этот виджет — иначе у вас будет два виджета на странице администрирования для управления отношением.
Обратите внимание, что при использовании этого метода сигналы m2m_changed не срабатывают. Это связано с тем, что, что касается администрирования, through — это просто модель с двумя полями внешнего ключа, а не отношением "многие ко многим".
Во всех остальных отношениях InlineModelAdmin точно такой же, как и любой другой. Вы можете настроить его внешний вид, используя любые обычные ModelAdmin свойства.
Работа с промежуточными моделями "многие ко многим"
Когда вы указываете промежуточную модель, используя аргумент through для ManyToManyField, администрирование не отобразит виджет по умолчанию. Это связано с тем, что каждый экземпляр этой промежуточной модели требует больше информации, чем можно отобразить в одном виджете, и макет, необходимый для нескольких виджетов, будет различаться в зависимости от промежуточной модели.
Однако нам все равно нужно иметь возможность редактировать эту информацию в строке. К счастью, это легко сделать с помощью встроенных моделей администрирования. Предположим, у нас есть следующие модели:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Первый шаг для отображения этой промежуточной модели в администрировании — определить класс встраиваемой модели для Membership модели:
class MembershipInline(admin.TabularInline):
model = Membership
extra = 1
Этот простой пример использует значения InlineModelAdmin по умолчанию для Membership модели и ограничивает дополнительные формы добавления одной. Это можно настроить, используя любой из вариантов, доступных классам InlineModelAdmin.
Теперь создайте админские представления для Person и Group моделей:
class PersonAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
Наконец, зарегистрируйте ваши Person и Group модели в админском сайте:
admin.site.register(Person, PersonAdmin) admin.site.register(Group, GroupAdmin)
Теперь ваш админский сайт настроен для редактирования объектов Membership в строке из страниц детализации Person или Group.
Использование общих отношений как встроенных
Возможно использование встроенного представления с обобщенно связанными объектами. Предположим, у вас есть следующие модели:
from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to="images")
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey("content_type", "object_id")
class Product(models.Model):
name = models.CharField(max_length=100)
Если вы хотите разрешить редактирование и создание экземпляра Image на страницах добавления/изменения Product, вы можете использовать GenericTabularInline или GenericStackedInline (оба подклассы GenericInlineModelAdmin), предоставленные admin. Они реализуют табличные и сточно-упакованные макеты форм для представления встроенных объектов соответственно, так же как и их необобщенные аналоги. Они ведут себя так же, как и любые другие встроенные представления. В вашей admin.py для приложения в этом примере:
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from myproject.myapp.models import Image, Product
class ImageInline(GenericTabularInline):
model = Image
class ProductAdmin(admin.ModelAdmin):
inlines = [
ImageInline,
]
admin.site.register(Product, ProductAdmin)
См. документацию по contenttypes для получения более подробной информации.
Переопределение шаблонов администрирования
Относительно легко переопределить многие шаблоны, используемые модулем администрирования для создания различных страниц сайта администрирования. Вы даже можете переопределить некоторые из этих шаблонов для определенного приложения или определенной модели.
Настройка каталогов шаблонов администрирования проекта
Файлы шаблонов администрирования находятся в каталоге contrib/admin/templates/admin.
Для переопределения одного или нескольких из них сначала создайте каталог admin в каталоге вашего проекта templates. Это может быть любой из каталогов, которые вы указали в опции DIRS бэкэнда DjangoTemplates в настройке TEMPLATES. Если вы изменили опцию 'loaders', убедитесь, что 'django.template.loaders.filesystem.Loader' предшествует 'django.template.loaders.app_directories.Loader', чтобы система загрузки шаблонов находила ваши пользовательские шаблоны перед теми, которые включены с django.contrib.admin.
Внутри этого admin каталога создайте подкаталоги, названные по имени вашего приложения. Внутри этих подкаталогов приложения создайте подкаталоги, названные по имени ваших моделей. Обратите внимание, что приложение админки преобразует имя модели в нижний регистр при поиске каталога, поэтому убедитесь, что вы назвали каталог в нижнем регистре, если собираетесь запускать приложение на файловой системе, чувствительной к регистру.
Чтобы переопределить шаблон админки для определенного приложения, скопируйте и отредактируйте шаблон из каталога django/contrib/admin/templates/admin и сохраните его в одном из только что созданных каталогов.
Например, если мы хотели добавить инструмент в представление списка изменений для всех моделей в приложении, названном my_app, мы скопировали бы contrib/admin/templates/admin/change_list.html в каталог templates/admin/my_app/ нашего проекта и внесли необходимые изменения.
Если мы хотели добавить инструмент в представление списка изменений только для определенной модели под названием «Страница», мы бы скопировали тот же файл в каталог templates/admin/my_app/page нашего проекта.
Переопределение или замена шаблона админки
Из-за модульного дизайна шаблонов админки, обычно ни необходимо, ни целесообразно заменять весь шаблон. Практически всегда лучше переопределить только ту часть шаблона, которую нужно изменить.
Продолжая пример выше, мы хотим добавить новую ссылку рядом с инструментом History для модели Page. Рассмотрев change_form.html, мы определили, что нам нужно только переопределить блок object-tools-items. Поэтому вот наш новый change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
<li>
<a href="{% url opts|admin_urlname:'history' original.pk|admin_urlquote %}" class="historylink">{% trans "History" %}</a>
</li>
<li>
<a href="mylink/" class="historylink">My Link</a>
</li>
{% if has_absolute_url %}
<li>
<a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a>
</li>
{% endif %}
{% endblock %}
И всё! Если мы поместили этот файл в каталог templates/admin/my_app, наша ссылка появится в форме изменения для всех моделей внутри my_app.
Шаблоны, которые можно переопределить по приложению или модели
Не каждый шаблон в contrib/admin/templates/admin можно переопределить по приложению или по модели. Следующие можно:
actions.htmlapp_index.htmlchange_form.htmlchange_form_object_tools.htmlchange_list.htmlchange_list_object_tools.htmlchange_list_results.htmldate_hierarchy.htmldelete_confirmation.htmlobject_history.htmlpagination.htmlpopup_response.htmlprepopulated_fields_js.htmlsearch_form.htmlsubmit_line.html
Была добавлена возможность переопределять шаблоны actions.html, change_form_object_tools.html, change_list_object_tools.html, change_list_results.html, date_hierarchy.html, pagination.html, prepopulated_fields_js.html, search_form.html, и submit_line.html.
Для тех шаблонов, которые нельзя переопределить таким образом, вы по-прежнему можете переопределить их для всего вашего проекта. Просто поместите новую версию в каталог templates/admin. Это особенно полезно для создания пользовательских страниц 404 и 500.
Примечание
Некоторые шаблоны админки, такие как change_list_results.html используются для рендеринга пользовательских тегов включения. Эти шаблоны можно переопределить, но в таких случаях вы, вероятно, лучше создадите свою собственную версию интересующего вас тега и дадите ему другое имя. Таким образом, вы сможете использовать его выборочно.
Шаблоны корневой и входной страниц
Если вы хотите изменить шаблоны главной страницы, входа или выхода, вам лучше создать свой собственный экземпляр AdminSite (см. ниже) и изменить свойства AdminSite.index_template, AdminSite.login_template или AdminSite.logout_template.
AdminSite объекты
-
class AdminSite(name='admin')[source] -
Сайт Django админки представлен экземпляром
django.contrib.admin.sites.AdminSite; по умолчанию создается экземпляр этого класса какdjango.contrib.admin.site, и вы можете зарегистрировать свои модели иModelAdminэкземпляры с ним.Если вы хотите настроить стандартный сайт админки, вы можете переопределить его.
При создании экземпляра
AdminSite, вы можете указать уникальное имя экземпляра, используя аргументnameконструктору. Это имя экземпляра используется для идентификации экземпляра, особенно при обращении к URL-адресам админки. Если имя экземпляра не указано, будет использоваться имя экземпляра по умолчаниюadmin. См. Настройка класса AdminSite для примера настройки классаAdminSite.
AdminSite атрибуты
Шаблоны могут переопределять или расширять базовые шаблоны админки, как описано в Переопределении шаблонов админки.
-
AdminSite.site_header -
Текст, отображаемый в верхней части каждой страницы админки, как
<h1>(строка). По умолчанию это «Администрирование Django».
-
AdminSite.site_title -
Текст, отображаемый в нижней части каждой страницы админки (строка). По умолчанию это «Админ-сайт Django».
-
AdminSite.site_url -
URL-адрес для ссылки «Просмотреть сайт» в верхней части каждой страницы админки. По умолчанию
site_urlэто/. Установите его вNoneчтобы убрать ссылку.Для сайтов, работающих на подпути, метод
each_context()проверяет, установлен лиrequest.META['SCRIPT_NAME']для текущего запроса, и использует это значение, еслиsite_urlне установлено на другое значение, кроме/.
-
AdminSite.index_title -
Текст, отображаемый в верхней части главной страницы админки (строка). По умолчанию это «Администрирование сайта».
-
AdminSite.index_template -
Путь к пользовательскому шаблону, который будет использоваться главным представлением индекса сайта админки.
-
AdminSite.app_index_template -
Путь к пользовательскому шаблону, который будет использоваться представлением индекса приложения сайта админки.
-
AdminSite.empty_value_display -
Строка, используемая для отображения пустых значений в списке изменений сайта админки. По умолчанию – тире. Значение также можно переопределить для каждой модели и в пользовательском поле в модели, установив атрибут
empty_value_displayдля поля. См.ModelAdmin.empty_value_displayдля примеров.
-
AdminSite.login_template -
Путь к пользовательскому шаблону, который будет использоваться представлением входа сайта админки.
-
AuthenticationForm -
Подкласс
AuthenticationForm, который будет использоваться представлением входа сайта админки.
-
AdminSite.logout_template -
Путь к пользовательскому шаблону, который будет использоваться представлением выхода сайта админки.
-
AdminSite.password_change_template -
Путь к пользовательскому шаблону, который будет использоваться представлением смены пароля сайта админки.
-
AdminSite.password_change_done_template -
Путь к пользовательскому шаблону, который будет использоваться представлением завершения смены пароля сайта админки.
AdminSite методы
-
AdminSite.each_context(request)[source] -
Возвращает словарь переменных для включения в контекст шаблона каждой страницы административной панели.
По умолчанию включает следующие переменные и значения:
-
site_header:AdminSite.site_header -
site_title:AdminSite.site_title -
site_url:AdminSite.site_url -
has_permission:AdminSite.has_permission() -
available_apps: список приложений из реестра приложений, доступных текущему пользователю. Каждый элемент списка — словарь, представляющий приложение с ключами:-
app_label: метка приложения -
app_url: URL страницы индекса приложения в административной панели -
has_module_perms: логическое значение, указывающее, разрешен ли доступ и отображение страницы индекса модуля текущему пользователю -
models: список моделей, доступных в приложении
Каждая модель — словарь с ключами:
-
object_name: имя класса модели -
name: множественное число имени модели -
perms: отслеживание прав доступа (dict,add,change,delete, иview). -
admin_url: URL страницы изменения списка модели в админке -
add_url: URL страницы добавления новой модели
-
-
-
AdminSite.has_permission(request)[source] -
Возвращает
True, если у пользователя с заданнымиHttpRequestправами доступа есть право просмотра хотя бы одной страницы в административной панели. По умолчанию требует, чтобы обаUser.is_activeиUser.is_staffбылиTrue.
-
AdminSite.register(model_or_iterable, admin_class=None, **options)[source] -
Регистрирует указанный класс модели (или итерируемый объект классов) с заданными
admin_class. По умолчаниюadmin_classустанавливается вModelAdmin(стандартные параметры администрирования). Если заданы ключевые аргументы, напримерlist_display, они будут использованы как параметры класса администрирования.Возбуждает
ImproperlyConfigured, если модель абстрактна, иdjango.contrib.admin.sites.AlreadyRegisteredесли модель уже зарегистрирована.
Подключение экземпляра AdminSite к URLconf
Последний шаг настройки Django admin — подключение экземпляра AdminSite к вашей URLconf. Сделайте это, указав определенный URL на метод AdminSite.urls. Не нужно использовать include().
В этом примере, мы регистрируем экземпляр по умолчанию AdminSite django.contrib.admin.site по URL /admin/
# urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
Настройка класса AdminSite
Если вы хотите создать свою административную панель с пользовательским поведением, вы можете наследовать от AdminSite и переопределить или добавить любые необходимые функции. Затем просто создайте экземпляр вашего подкласса AdminSite (как вы создаете любой другой класс Python) и зарегистрируйте ваши модели и подклассы ModelAdmin с ним вместо стандартной панели. Наконец, обновите myproject/urls.py , чтобы он ссылался на ваш подкласс AdminSite.
from django.contrib.admin import AdminSite
from .models import MyModel
class MyAdminSite(AdminSite):
site_header = 'Monty Python administration'
admin_site = MyAdminSite(name='myadmin')
admin_site.register(MyModel)
from django.urls import path
from myapp.admin import admin_site
urlpatterns = [
path('myadmin/', admin_site.urls),
]
Обратите внимание, что вам может не потребоваться автоматическое обнаружение модулей admin при использовании своего экземпляра AdminSite, так как вы, скорее всего, импортируете все модули admin для каждой приложения в модуле myproject.admin. Это означает, что вам нужно поместить 'django.contrib.admin.apps.SimpleAdminConfig' вместо 'django.contrib.admin' в настройку INSTALLED_APPS.
Переопределение стандартной административной панели
Вы можете переопределить стандартную django.contrib.admin.site , установив атрибут default_site в пользовательском AppConfig на импортированный путь, который указывает на подкласс AdminSite или на вызываемый объект, возвращающий экземпляр сайта.
from django.contrib import admin
class MyAdminSite(admin.AdminSite):
...
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'myproject.admin.MyAdminSite'
INSTALLED_APPS = [
...
'myproject.apps.MyAdminConfig', # replaces 'django.contrib.admin'
...
]
Несколько административных панелей в одной URLconf
Легко создать несколько экземпляров административной панели на одном сайте Django. Просто создайте несколько экземпляров AdminSite и настройте каждый из них на различный URL.
В этом примере, URL /basic-admin/ и /advanced-admin/ имеют отдельные версии админ панели — используя экземпляры AdminSite myproject.admin.basic_site и myproject.admin.advanced_site, соответственно:
# urls.py
from django.urls import path
from myproject.admin import advanced_site, basic_site
urlpatterns = [
path('basic-admin/', basic_site.urls),
path('advanced-admin/', advanced_site.urls),
]
Экземпляры AdminSite принимают единственный аргумент в конструктор, их имя, которое может быть любым. Этот аргумент становится префиксом к именам URL для целей обращения к ним. Это необходимо только если вы используете более одной AdminSite.
Добавление представлений в административные панели
Так же, как и ModelAdmin, AdminSite предоставляет метод get_urls(), который может быть переопределен для определения дополнительных представлений для сайта. Для добавления нового представления в вашу административную панель, расширьте базовый метод get_urls(), чтобы включить шаблон для вашего нового представления.
Примечание
Любое представление, которое использует административные шаблоны или расширяет базовый шаблон администратора, должно установить request.current_app перед отображением шаблона. Оно должно быть установлено в self.name если ваше представление на странице AdminSite, или self.admin_site.name если ваше представление на странице ModelAdmin.
Добавление функции сброса пароля
Вы можете добавить функцию сброса пароля в админ панель, добавив несколько строк в ваш URLconf. В частности, добавьте эти четыре шаблона:
from django.contrib.auth import views as auth_views
path(
'admin/password_reset/',
auth_views.PasswordResetView.as_view(),
name='admin_password_reset',
),
path(
'admin/password_reset/done/',
auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done',
),
path(
'reset/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm',
),
path(
'reset/done/',
auth_views.PasswordResetCompleteView.as_view(),
name='password_reset_complete',
),
(Предполагается, что вы добавили админ панель по admin/ и необходимо расположить URL, начинающиеся с ^admin/ перед строкой, включающей сам модуль админ панели).
Наличие имени URL admin_password_reset приведет к появлению ссылки «Забыли пароль?» на странице входа в стандартную админ панель под полем для ввода пароля.
LogEntry объекты
-
class models.LogEntry -
Класс
LogEntryотслеживает добавления, изменения и удаления объектов, выполненные через административную панель.
LogEntry атрибуты
-
LogEntry.action_time -
Дата и время действия.
-
LogEntry.user -
Пользователь (экземпляр
AUTH_USER_MODEL) который выполнил действие.
-
LogEntry.content_type -
Тип
ContentTypeизменённого объекта.
-
LogEntry.object_id -
Текстовое представление первичного ключа изменённого объекта.
-
LogEntry.object_repr -
Представление объекта
repr()после изменения.
-
LogEntry.action_flag -
Тип выполненного действия:
ADDITION,CHANGE,DELETION.Например, для получения списка всех добавлений, выполненных через админку:
from django.contrib.admin.models import ADDITION, LogEntry LogEntry.objects.filter(action_flag=ADDITION)
-
LogEntry.change_message -
Подробное описание изменения. В случае редактирования, например, сообщение содержит список изменённых полей. Сайт Django admin форматирует это содержимое как JSON-структуру, чтобы
get_change_message()мог пересобрать сообщение, переведённое на язык текущего пользователя. Однако, пользовательский код может установить это как обычную строку. Рекомендуется использовать методget_change_message()для получения этого значения вместо прямого доступа.
LogEntry методы
-
LogEntry.get_edited_object() -
Сокращение, возвращающее ссылку на объект.
-
LogEntry.get_change_message() -
Форматирует и переводит
change_messageна язык текущего пользователя. Сообщения, созданные до Django 1.10, всегда будут отображаться на языке, на котором они были записаны.
Обращение к URL-адресам админки
Когда AdminSite развернут, предоставляемые им представления доступны с помощью системы обратного преобразования URL Django системы обратного преобразования URL-адресов.
AdminSite предоставляет следующие именованные URL-шаблоны:
| Страница | Имя URL | Параметры |
|---|---|---|
| Главная | index | |
| Вход | login | |
| Выход | logout | |
| Смена пароля | password_change | |
| Смена пароля завершена | password_change_done | |
| JavaScript i18n | jsi18n | |
| Главная страница приложения | app_list | app_label |
| Переход на страницу объекта | view_on_site |
content_type_id, object_id
|
Каждый экземпляр ModelAdmin предоставляет дополнительный набор именованных URL-адресов:
| Страница | Имя URL | Параметры |
|---|---|---|
| Список изменений | {{ app_label }}_{{ model_name }}_changelist | |
| Добавить | {{ app_label }}_{{ model_name }}_add | |
| История | {{ app_label }}_{{ model_name }}_history | object_id |
| Удалить | {{ app_label }}_{{ model_name }}_delete | object_id |
| Изменить | {{ app_label }}_{{ model_name }}_change | object_id |
UserAdmin предоставляет именованный URL:
| Страница | Имя URL | Параметры |
|---|---|---|
| Смена пароля | auth_user_password_change | user_id |
Эти именованные URL-адреса зарегистрированы с пространством имён приложения admin, и с пространством имён экземпляра, соответствующим имени экземпляра сайта.
Итак, если вы хотите получить ссылку на представление Change для конкретного объекта Choice (из приложения polls) в стандартной админке, вы вызовете:
>>> from django.urls import reverse
>>> c = Choice.objects.get(...)
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,))
Это найдёт первый зарегистрированный экземпляр приложения админки (какое бы имя он ни имел) и перенаправит к представлению для изменения объектов poll.Choice в этом экземпляре.
Если вы хотите найти URL в определённом экземпляре админки, укажите имя этого экземпляра как подсказку для обратного вызова. Например, если вам нужен конкретно админ-внешний вид из экземпляра админки под именем custom, вы должны вызвать:
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,), current_app='custom')
Дополнительную информацию см. в документации по обратному преобразованию именованных URL.
Для упрощения обращения к URL-адресам админки в шаблонах Django предоставляет фильтр admin_urlname, который принимает действие в качестве аргумента:
{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>
Действие в примерах выше соответствует последней части имён URL для экземпляров ModelAdmin, описанных выше. Переменная opts может быть любым объектом, у которого есть атрибуты app_label и model_name, и обычно предоставляется админскими представлениями для текущей модели.
Декоратор staff_member_required
-
staff_member_required(redirect_field_name='next', login_url='admin:login')[source] -
Этот декоратор используется для админских представлений, требующих авторизации. Представление, украшенное этой функцией, будет вести себя следующим образом:
- Если пользователь авторизован, является сотрудником (
User.is_staff=True) и активен (User.is_active=True), представление выполняется нормально. - В противном случае запрос перенаправляется на URL, указанный параметром
login_url, с исходным запрошенным путём в переменной запроса, указанной вredirect_field_name. Например:/admin/login/?next=/admin/polls/question/3/.
Пример использования:
from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ... - Если пользователь авторизован, является сотрудником (
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.1/ref/contrib/admin/index/