fields

Атрибут ModelAdmin.fields позволяет настраивать расположение и отображение полей в формах добавления (“add”) и изменения (“change”) объекта модели в админ-панели.

  1. Синтаксис: Укажите список имен полей, которые необходимо показать на форме.

    class FlatPageAdmin(admin.ModelAdmin):
        fields = ("url", "title", "content")
  2. Порядок: Порядок перечисления полей в списке fields соответствует их порядку отображения в форме.

  3. Группировка: Чтобы отобразить несколько полей в одной строке, объедините их в кортеж.

    class FlatPageAdmin(admin.ModelAdmin):
        fields = (("url", "title"), "content")
  4. Принимаемые значения: Опция fields принимает те же типы значений, что и list_display, за исключением того, что callable-объекты не принимаются. Имена методов модели и администратора модели будут использоваться только в том случае, если они перечислены в readonly_fields.

  5. Обязательно должны быть перечислены поля, которые не могут принимать значение null и не имеют значения по умолчанию.


exclude

Атрибут ModelAdmin.exclude позволяет указать, какие поля модели не должны быть включены в формы добавления (“add”) и редактирования (“change”) в админ-панели, другими словами, исключает указанные поля из этих форм.

  1. Синтаксис: Укажите в exclude список названий полей, которые нужно исключить из формы.

    class AuthorAdmin(admin.ModelAdmin):
        exclude = ("birth_date",)

Использование вместе с fields - ****exclude и fields взаимоисключают друг друга. При перечислении одних и тех же полей в fields и exclude - будет вызвана ошибка.


readonly_fields

Атрибут ModelAdmin.readonly_fields предназначен для отображения определенных полей модели в режиме “только чтение” на страницах добавления и редактирования объектов в админ-панели.

Синтаксис: Атрибут readonly_fields может содержать список или кортеж полей.

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    readonly_fields = ('time_create', 'time_update')

Ключевые особенности

  • Не редактируемые поля: Поля, указанные в readonly_fields, отображаются как обычный текст, без возможности редактирования их содержимого.
  • Исключение из ModelForm: Такие поля исключаются из ModelForm, которая генерирует форму. Это предотвращает отправку изменений для этих полей при сохранении формы.
  • Поддержка функций (callables): В readonly_fields можно указывать имена методов модели или admin.display. Это позволяет отображать значения, вычисляемые на лету.

Примечания

  1. Порядок: Если вы используете readonly_fields вместе с fields или fieldsets, то поля из readonly_fields должны быть также включены в эти атрибуты, чтобы они отображались на форме.
  2. Позиционирование: Если readonly_fields используется без fields или fieldsets, то поля “только чтение” размещаются после всех редактируемых полей формы.

prepopulated_fields

Атрибут ModelAdmin.prepopulated_fields позволяет автоматически заполнять определённые поля на основании значений других полей модели. Часто он используется для автогенерации slug полей (типа SlugField).

Как работает:

  1. Вы определяете prepopulated_fields как словарь вида:

    prepopulated_fields = {"slug": ("title",)}

    Это означает: “Автоматически сгенерировать и заполнить поле ‘slug’ на основе значения поля ‘title’.”

  2. Django включает небольшой JavaScript код, выполняющий автозаполнение.

  3. Поле, которое будет автоматически заполняться, должно быть редактируемым (то есть его нельзя указывать в readonly_fields).

Warning

Обратите внимание, что предзаполненные поля не изменяются JavaScript после сохранения значения. Обычно не желательно, чтобы слаги менялись после сохранения (что приведет к изменению URL-адреса объекта, если слаг используется в нем).

prepopulated_fields не работает с полями следующих типов:

  • DateTimeField
  • ForeignKey
  • OneToOneField
  • ManyToManyField

Альтернативные варианты автоматического создания слага, рассмотрены здесь.


filter_horizontal / filter_vertical

По умолчанию поля ManyToManyField отображаются как множественный выбор (<select multiple>).

filter_horizontal меняет этот интерфейс на более удобный в случае большого количества опций. Фильтр отображает два поля - выбранные и не выбранные - горизонтально, друг рядом с другом. Между ними находятся кнопки для добавления/удаления вариантов. Кроме того, есть поле поиска для быстрого сужения списка опций.

filter_vertical аналогично filter_horizontal используется для полей типа ManyToManyField, но визуально отличается. Поля для выбранных и не выбранных элементов расположены вертикально друг над другом. Механизм взаимодействия тот же, что и в filter_horizontal (кнопки “добавить”/“убрать” и поиск).

Warning

Если используется fields, то поля, перечисленные в атрибутах filter_horizontal или filter_vertical также должны быть указаны в fields, иначе они не будут отображаться в форме.

〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰