Spec-Zone.ru › Wagtail

Добавление пользовательских массовых действий

Этот документ описывает, как добавить пользовательские массовые действия к различным спискам.

Регистрация пользовательского массового действия

from wagtail.admin.views.bulk_action import BulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomDeleteBulkAction(BulkAction):
    display_name = _("Delete")
    aria_label = _("Delete selected objects")
    action_type = "delete"
    template_name = "/path/to/confirm_bulk_delete.html"
    models = [...]

    @classmethod
    def execute_action(cls, objects, **kwargs):
        for obj in objects:
            do_something(obj)
        return num_parent_objects, num_child_objects  # return the count of updated objects

Атрибуты следующие:

  • display_name - Текст метки, который будет отображаться на кнопке в пользовательском интерфейсе
  • aria_label - Атрибут aria-label, который будет применён к кнопке в пользовательском интерфейсе
  • action_type - Уникальный идентификатор действия. Будет необходим в URL для массовых действий
  • template_name - Путь к шаблону подтверждения
  • models - Список моделей, к которым может быть применено массовое действие
  • action_priority (необязательно) - Число, используемое для определения расположения кнопки в списке кнопок
  • classes (необязательно) - Набор имён CSS-классов, которые будут использованы на кнопке в пользовательском интерфейсе

Пример шаблона подтверждения:

<!-- /path/to/confirm_bulk_delete.html -->

{% extends 'wagtailadmin/bulk_actions/confirmation/base.html' %}
{% load i18n wagtailadmin_tags %}

{% block titletag %}{% blocktrans trimmed count counter=items|length %}Delete 1 item{% plural %}Delete {{ counter }} items{% endblocktrans %}{% endblock %}

{% block header %}
    {% trans "Delete" as del_str %}
    {% include "wagtailadmin/shared/header.html" with title=del_str icon="doc-empty-inverse" %}
{% endblock header %}

{% block items_with_access %}
        {% if items %}
        <p>{% trans "Are you sure you want to delete these items?" %}</p>
        <ul>
            {% for item in items %}
            <li>
                <a href="" target="_blank" rel="noreferrer">{{ item.item.title }}</a>
            </li>
            {% endfor %}
        </ul>
        {% endif %}
{% endblock items_with_access %}

{% block items_with_no_access %}

{% blocktrans trimmed asvar no_access_msg count counter=items_with_no_access|length %}You don't have permission to delete this item{% plural %}You don't have permission to delete these items{% endblocktrans %}
{% include './list_items_with_no_access.html' with items=items_with_no_access no_access_msg=no_access_msg %}

{% endblock items_with_no_access %}

{% block form_section %}
{% if items %}
    {% trans 'Yes, delete' as action_button_text %}
    {% trans "No, don't delete" as no_action_button_text %}
    {% include 'wagtailadmin/bulk_actions/confirmation/form.html' with action_button_class="serious" %}
{% else %}
    {% include 'wagtailadmin/bulk_actions/confirmation/go_back.html' %}
{% endif %}
{% endblock form_section %}
<!-- ./list_items_with_no_access.html -->
{% extends 'wagtailadmin/bulk_actions/confirmation/list_items_with_no_access.html' %}
{% load i18n %}

{% block per_item %}
    {% if item.can_edit %}
    <a href="{% url 'wagtailadmin_pages:edit' item.item.id %}" target="_blank" rel="noreferrer">{{ item.item.title }}</a>
    {% else %}
    {{ item.item.title }}
    {% endif %}
{% endblock per_item %}

Метод execute_action — единственный метод, который необходимо переопределить, чтобы массовое действие работало корректно. Он принимает список объектов в качестве единственного обязательного аргумента и множество ключевых аргументов, которые могут быть переданы путём переопределения метода get_execution_context. Например.

@classmethod
def execute_action(cls, objects, **kwargs):
    # the kwargs here is the output of the get_execution_context method
    user = kwargs.get('user', None)
    num_parent_objects, num_child_objects = 0, 0
    # you could run the action per object or run them in bulk using django's bulk update and delete methods
    for obj in objects:
        num_child_objects += obj.get_children().count()
        num_parent_objects += 1
        obj.delete(user=user)
        num_parent_objects += 1
    return num_parent_objects, num_child_objects

Метод get_execution_context можно переопределить, чтобы предоставить контекст для execute_action

def get_execution_context(self):
    return { 'user': self.request.user }

Метод get_context_data можно переопределить, чтобы передать дополнительный контекст в шаблон подтверждения.

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['new_key'] = some_value
    return context

Метод check_perm можно переопределить, чтобы проверить, имеет ли объект определённое разрешение. Объекты, для которых check_perm возвращает False, будут доступны в контексте под ключом 'items_with_no_access'.

def check_perm(self, obj):
    return obj.has_perm('some_perm')  # returns True or False

Сообщение об успехе, отображаемое в админке, можно настроить, переопределив метод get_success_message.

def get_success_message(self, num_parent_objects, num_child_objects):
    return _("{} objects, including {} child objects have been updated".format(num_parent_objects, num_child_objects))

Добавление массовых действий в исследователь страниц

При создании класса пользовательского массового действия для страниц, наследуйте от wagtail.admin.views.pages.bulk_actions.page_bulk_action.PageBulkAction вместо wagtail.admin.views.bulk_action.BulkAction

Базовый пример

from wagtail.admin.views.pages.bulk_actions.page_bulk_action import PageBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomPageBulkAction(PageBulkAction):
    ...

Добавление массовых действий в список изображений

При создании класса пользовательского массового действия для изображений, наследуйте от wagtail.images.views.bulk_actions.image_bulk_action.ImageBulkAction вместо wagtail.admin.views.bulk_action.BulkAction

Базовый пример

from wagtail.images.views.bulk_actions.image_bulk_action import ImageBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomImageBulkAction(ImageBulkAction):
    ...

Добавление массовых действий в список документов

При создании класса пользовательского массового действия для документов, наследуйте от wagtail.documents.views.bulk_actions.document_bulk_action.DocumentBulkAction вместо wagtail.admin.views.bulk_action.BulkAction

Базовый пример

from wagtail.documents.views.bulk_actions.document_bulk_action import DocumentBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomDocumentBulkAction(DocumentBulkAction):
    ...

Добавление массовых действий в список пользователей

При создании класса пользовательского массового действия для пользователей, наследуйте от wagtail.users.views.bulk_actions.user_bulk_action.UserBulkAction вместо wagtail.admin.views.bulk_action.BulkAction

Базовый пример

from wagtail.users.views.bulk_actions.user_bulk_action import UserBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomUserBulkAction(UserBulkAction):
    ...

Добавление массовых действий в список фрагментов

При создании класса пользовательского массового действия для фрагментов, наследуйте от wagtail.snippets.bulk_actions.snippet_bulk_action.SnippetBulkAction вместо wagtail.admin.views.bulk_action.BulkAction

Базовый пример

from wagtail.snippets.bulk_actions.snippet_bulk_action import SnippetBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomSnippetBulkAction(SnippetBulkAction):
    # ...

Если вы хотите применить действие только к определённым фрагментам, переопределите список models в классе действия

from wagtail.snippets.bulk_actions.snippet_bulk_action import SnippetBulkAction
from wagtail import hooks


@hooks.register('register_bulk_action')
class CustomSnippetBulkAction(SnippetBulkAction):
    models = [SnippetA, SnippetB]
    # ...

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

Spec-Zone.ru

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