Spec-Zone.ru › Wagtail

Настройка modeladmin

Приложение modeladmin разработано, чтобы предоставить вам максимальную гибкость в том, как ваши модели и их объекты отображаются в CMS Wagtail. Эта страница предназначена для предоставления вам справочной информации, чтобы помочь вам лучше понять, что может делать приложение, и указать правильное направление в зависимости от типа настраиваемых изменений, которые вы хотите внести.

  • Класс Wagtail ModelAdmin отличается от Django
  • Изменение отображаемого в списке
  • Добавление дополнительных стилей и/или JavaScript
  • Переопределение шаблонов
  • Переопределение представлений
  • Переопределение вспомогательных классов

Класс Wagtail ModelAdmin отличается от Django

Класс Wagtail ModelAdmin разработан для использования аналогичным образом к классу Django с тем же именем, и часто использует те же имена атрибутов и методов для достижения похожих результатов. Однако существуют некоторые ключевые различия:

Формы добавления и редактирования все еще определяются panels и edit_handlers

В Wagtail, управление отображением полей в формах добавления/редактирования для вашей Model, а также определение их группировки и порядка, достигается путем добавления атрибута panels или edit_handler к вашему классу Model. Это остается неизменным, независимо от того, является ли ваша модель типом Page, фрагментом или просто стандартной моделью Django Model. Из-за этого класс Wagtail ModelAdmin в основном связан с настройкой «списка». Например, атрибуты list_display, list_filter и search_fields присутствуют и поддерживают в основном те же значения, что и класс ModelAdmin Django, в то время как fields, fieldsets, exclude и другие атрибуты, которые вы могли использовать для настройки представлений добавления/редактирования Django, просто не поддерживаются в версии Wagtail.

Модели «типов страниц» требуют иного обращения, чем другие модели

Хотя представление списка modeladmin и поддерживаемые параметры настройки работают одинаково для всех типов Model, в отношении других представлений управления обработка отличается в зависимости от того, представляет ли ваш класс ModelAdmin модель типа страницы (расширяющая wagtailcore.models.Page) или нет.

Страницы в Wagtail имеют некоторые уникальные свойства и требуют дополнительных представлений, элементов интерфейса и общей обработки для эффективного управления. Например, они имеют древовидную структуру, которую необходимо правильно сохранять при добавлении, удалении и перемещении страниц. У них также есть система ревизий, свои собственные соображения по разрешениям и возможность предварительного просмотра изменений перед сохранением. Из-за этой дополнительной сложности Wagtail предоставляет свои собственные специфические представления для управления любыми настраиваемыми типами страниц, которые вы можете добавить в свой проект (неважно, создаете ли вы для них класс ModelAdmin или нет).

Для обеспечения согласованного пользовательского опыта modeladmin просто перенаправляет пользователей на существующие представления управления страницами Wagtail, где это возможно. Вы должны помнить об этом, если вы когда-нибудь захотите изменить то, что происходит при добавлении, удалении, публикации страниц определенного типа или применении к ним других действий. Настройка CreateView или EditView для вашего типа страницы Model (даже если только для добавления дополнительного стиля или JavaScript) не будет иметь никакого эффекта, поскольку эти представления не используются.

Если вам все же нужно настроить поведение добавления, редактирования или другое для модели типа страницы, ознакомьтесь с данной частью документации: Плагины.

Класс Wagtail ModelAdmin «модульный»

В отличие от класса Django с тем же именем, ModelAdmin wagtailadmin действует в первую очередь как класс «контроллера». Хотя у него есть набор атрибутов и методов, позволяющих настроить то, как различные компоненты должны обрабатывать вашу модель, он был специально разработан для выполнения минимального объёма работы; он делегирует всю реальную работу набору отдельных, взаимозаменяемых компонентов.

Идея в том, что если вы хотите сделать что-то по-другому или добавить функциональность, которой modeladmin еще не обладает, вы можете создать новые классы (или расширить предоставленные modeladmin) и легко настроить свой класс ModelAdmin для их использования вместо стандартных.

  • Подробнее о Переопределении представлений
  • Подробнее о Переопределении вспомогательных классов

Изменение отображаемого в списке

Ознакомьтесь с атрибутами и методами, поддерживаемыми классом ModelAdmin, которые позволяют изменить отображаемое в IndexView. Следующая страница предоставит вам все необходимое для начала работы: Настройка IndexView — представления списка

Добавление дополнительных стилей и/или JavaScript

Класс ModelAdmin предоставляет несколько атрибутов, которые позволяют легко добавлять дополнительные стили и JavaScript в админский интерфейс для вашей модели. Каждый атрибут просто должен быть списком путей к файлам, которые вы хотите включить. Если путь к файлу находится в каталоге статических файлов вашего проекта, Wagtail автоматически добавит к пути префикс STATIC_URL, чтобы вам не нужно было повторять его каждый раз в списке путей.

Если вы хотите добавить стили или скрипты в IndexView, установите следующие атрибуты:

  • index_view_extra_css — где каждый элемент — имя пути к предварительно скомпилированному стилю, который вы хотите включить.
  • index_view_extra_js — где каждый элемент — имя пути к файлу JavaScript, который вы хотите включить.

Если вы хотите сделать то же самое для CreateView и EditView, установите следующие атрибуты:

  • form_view_extra_css — где каждый элемент — имя пути к предварительно скомпилированному стилю, который вы хотите включить.
  • form_view_extra_js — где каждый элемент — имя пути к файлу JavaScript, который вы хотите включить.

И если вы используете InspectView для своей модели и хотите сделать то же самое для этого представления, установите следующие атрибуты:

  • inspect_view_extra_css — где каждый элемент — имя пути к предварительно скомпилированному стилю, который вы хотите включить.
  • inspect_view_extra_js — где каждый элемент — имя пути к файлу JavaScript, который вы хотите включить.

Переопределение шаблонов

Для всех представлений modeladmin Wagtail ищет шаблоны в следующих папках вашего проекта или приложения, прежде чем обращаться к значениям по умолчанию:

  1. templates/modeladmin/app-name/model-name/
  2. templates/modeladmin/app-name/
  3. templates/modeladmin/

Таким образом, чтобы переопределить шаблон, используемый, например, IndexView, вы создаете новый шаблон index.html и помещаете его в одно из этих мест. Например, если вы хотите сделать это для модели ArticlePage в приложении news, вы добавите свой пользовательский шаблон как news/templates/modeladmin/news/articlepage/index.html.

Для справки, modeladmin ищет шаблоны с указанными именами для каждого представления:

  • 'index.html' для IndexView
  • 'inspect.html' для InspectView
  • 'create.html' для CreateView
  • 'edit.html' для EditView
  • 'delete.html' для DeleteView
  • 'choose_parent.html' для ChooseParentView

Чтобы добавить дополнительную информацию в блок в одном из вышеперечисленных шаблонов Wagtail, используйте метод Django {{ block.super }} в {% block ... %}, который вы хотите расширить. Например, если вы хотите отобразить изображение в форме редактирования под полями редактируемой модели, вы можете сделать следующее:

    {% extends "modeladmin/edit.html" %}
    {% load static %}

    {% block content %}
        {{ block.super }}
        <div>
            <img src="{% get_media_prefix %}{{ instance.image }}"/>
        </div>
    {% endblock %}

Если по какой-либо причине вы предпочитаете обойти указанное выше поведение и явно указать шаблон для определенного представления, вы можете установить любой из следующих атрибутов в вашем классе ModelAdmin:

  • index_template_name для указания шаблона для IndexView
  • inspect_template_name для указания шаблона для InspectView
  • create_template_name для указания шаблона для CreateView
  • edit_template_name для указания шаблона для EditView
  • delete_template_name для указания шаблона для DeleteView
  • choose_parent_template_name для указания шаблона для ChooseParentView

Переопределение представлений

Для всех представлений, предлагаемых ModelAdmin, класс предоставляет атрибут, который вы можете переопределить, чтобы указать, какой класс вы хотели бы использовать:

  • index_view_class
  • inspect_view_class
  • create_view_class (не используется для моделей типа «страница»)
  • edit_view_class (не используется для моделей типа «страница»)
  • delete_view_class (не используется для моделей типа «страница»)
  • choose_parent_view_class (используется только для моделей типа «страница»)

Например, если вы хотите создать свой собственный класс представления и использовать его для IndexView, вы сделаете следующее:

    from wagtail.contrib.modeladmin.views import IndexView
    from wagtail.contrib.modeladmin.options import ModelAdmin
    from .models import MyModel

    class MyCustomIndexView(IndexView):
        # New functionality and existing method overrides added here
        ...


    class MyModelAdmin(ModelAdmin):
        model = MyModel
        index_view_class = MyCustomIndexView

Или, если вам не нужны никакие функции существующего функционала IndexView в вашем представлении и вы предпочитаете создать своё представление с нуля, modeladmin также поддержит это. Однако настоятельно рекомендуется использовать modeladmin.views.WMABaseView в качестве основы для вашего представления. Это значительно упростит интеграцию с вашим классом ModelAdmin и предоставит множество полезных атрибутов и методов для начала работы.

Вы также можете использовать url_helper для удобного обратного преобразования URL-адресов для любого ModelAdmin, см. Обратное преобразование URL-адресов ModelAdmin.

Переопределение вспомогательных классов

Хотя «классы представлений» отвечают за большую часть работы, существует ряд других задач, которые modeladmin должен выполнять регулярно, которые необходимо обрабатывать последовательно и в нескольких местах. Эти задачи назначены набору простых классов (в modeladmin, они называются «вспомогательными классами») и находятся в wagtail.contrib.modeladmin.helpers.

Если вы планируете писать и использовать свои собственные пользовательские представления с modeladmin, вам следует ознакомиться с этими помощниками, так как они предоставляются представлениям через представление modeladmin.views.WMABaseView.

Существует три типа «вспомогательных классов»:

  • Вспомогательные классы URL - которые помогают с согласованным формированием, именованием и ссылкой на URL-адреса.
  • Вспомогательные классы разрешений - которые помогают гарантировать, что только пользователи с достаточными разрешениями могут выполнять определенные действия или видеть варианты выполнения этих действий.
  • Вспомогательные классы кнопок - которые, с помощью двух других, помогают с формированием кнопок для использования в ряде мест.

Класс ModelAdmin позволяет определять и использовать свои собственные вспомогательные классы, устанавливая значения следующих атрибутов:

ModelAdmin.url_helper_class

По умолчанию используется класс modeladmin.helpers.url.PageAdminURLHelper когда ваша модель расширяет wagtailcore.models.Page, в противном случае используется modeladmin.helpers.url.AdminURLHelper.

Если вы обнаружите, что вышеперечисленные вспомогательные классы не подходят для ваших нужд, вы можете легко создать свой собственный вспомогательный класс, унаследовав AdminURLHelper или PageAdminURLHelper (если ваша модель расширяет модель Wagtail Page) и внести необходимые дополнения/переопределения.

После определения своего класса установите атрибут url_helper_class в вашем классе ModelAdmin, чтобы использовать свой пользовательский URLHelper, как показано ниже:

    from wagtail.contrib.modeladmin.helpers import AdminURLHelper
    from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
    from .models import MyModel


    class MyURLHelper(AdminURLHelper):
        ...


    class MyModelAdmin(ModelAdmin):
        model = MyModel
        url_helper_class = MyURLHelper

    modeladmin_register(MyModelAdmin)

Или, если у вас более сложный случай использования, где простое установление этого атрибута невозможно (например, из-за циклических импортов) или не удовлетворяет вашим потребностям, вы можете переопределить метод get_url_helper_class, как показано ниже:

    class MyModelAdmin(ModelAdmin):
        model = MyModel

        def get_url_helper_class(self):
            if self.some_attribute is True:
                return MyURLHelper
            return AdminURLHelper

ModelAdmin.permission_helper_class

По умолчанию используется класс modeladmin.helpers.permission.PagePermissionHelper когда ваша модель расширяет wagtailcore.models.Page, в противном случае используется modeladmin.helpers.permission.PermissionHelper.

Если вы обнаружите, что вышеперечисленные вспомогательные классы не подходят для ваших нужд, вы можете легко создать свой собственный вспомогательный класс, унаследовав PermissionHelper (или PagePermissionHelper если ваша модель расширяет модель Wagtail Page) и внести необходимые дополнения/переопределения. После определения установите атрибут permission_helper_class в вашем классе ModelAdmin для использования вашего пользовательского класса вместо стандартного, как показано ниже:

    from wagtail.contrib.modeladmin.helpers import PermissionHelper
    from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
    from .models import MyModel


    class MyPermissionHelper(PermissionHelper):
        ...


    class MyModelAdmin(ModelAdmin):
        model = MyModel
        permission_helper_class = MyPermissionHelper

    modeladmin_register(MyModelAdmin)

Или, если у вас более сложный случай использования, где простое установление атрибута невозможно или не удовлетворяет вашим потребностям, вы можете переопределить метод get_permission_helper_class, как показано ниже:

    class MyModelAdmin(ModelAdmin):
        model = MyModel

        def get_permission_helper_class(self):
            if self.some_attribute is True:
                return MyPermissionHelper
            return PermissionHelper

ModelAdmin.button_helper_class

По умолчанию используется класс modeladmin.helpers.button.PageButtonHelper когда ваша модель расширяет wagtailcore.models.Page, в противном случае используется modeladmin.helpers.button.ButtonHelper.

Если вы хотите добавить или изменить кнопки для представления списка вашей модели IndexView, вам необходимо создать свой собственный класс вспомогательных кнопок, унаследовав ButtonHelper или PageButtonHelper (если ваша модель расширяет модель Wagtail Page) и внести необходимые дополнения/переопределения. После определения установите атрибут button_helper_class в вашем классе ModelAdmin для использования вашего пользовательского класса вместо стандартного, как показано ниже:

    from wagtail.contrib.modeladmin.helpers import ButtonHelper
    from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
    from .models import MyModel


    class MyButtonHelper(ButtonHelper):
        def add_button(self, classnames_add=None, classnames_exclude=None):
            if classnames_add is None:
                classnames_add = []
            if classnames_exclude is None:
                classnames_exclude = []
            classnames = self.add_button_classnames + classnames_add
            cn = self.finalise_classname(classnames, classnames_exclude)
            return {
                'url': self.url_helper.create_url,
                'label': _('Add %s') % self.verbose_name,
                'classname': cn,
                'title': _('Add a new %s') % self.verbose_name,
            }

        def inspect_button(self, pk, classnames_add=None, classnames_exclude=None):
            ...

        def edit_button(self, pk, classnames_add=None, classnames_exclude=None):
            ...

        def delete_button(self, pk, classnames_add=None, classnames_exclude=None):
            ...


    class MyModelAdmin(ModelAdmin):
        model = MyModel
        button_helper_class = MyButtonHelper

    modeladmin_register(MyModelAdmin)

Для настройки кнопок, отображаемых в представлении списка ModelAdmin, можно изменить возвращаемый словарь в методах add_button, delete_button, edit_button или inspect_button. Например, если вы хотите изменить кнопку Delete, вы можете изменить метод delete_button в своем классе ButtonHelper, как показано ниже:

    class MyButtonHelper(ButtonHelper):
        ...
        def delete_button(self, pk, classnames_add=None, classnames_exclude=None):
            ...
            return {
                'url': reverse("your_custom_url"),
                'label': _('Delete'),
                'classname': "custom-css-class",
                'title': _('Delete this item')
            }

Или, если у вас более сложный случай использования, где простое установление атрибута невозможно или не удовлетворяет вашим потребностям, вы можете переопределить метод get_button_helper_class, как показано ниже:

    class MyModelAdmin(ModelAdmin):
        model = MyModel

        def get_button_helper_class(self):
            if self.some_attribute is True:
                return MyButtonHelper
            return ButtonHelper

Использование вспомогательных классов в пользовательских представлениях

Пока вы наследуете modeladmin.views.WMABaseView (или один из более «специфических» классов представлений) для создания своего пользовательского представления, экземпляры каждого помощника должны быть доступны в экземплярах вашего класса как:

  • self.url_helper
  • self.permission_helper
  • self.button_helper

В отличие от двух других, self.button_helper не заполняется сразу при создании представления. Для отображения правильных кнопок для правильных пользователей экземпляры ButtonHelper должны быть «осознающими запрос», поэтому self.button_helper устанавливается только после выполнения метода dispatch() представления, который принимает объект HttpRequest в качестве аргумента, из которого можно определить текущего пользователя.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/reference/contrib/modeladmin/primer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API