Добавление пользовательских массовых действий
В данном документе описано, как добавить пользовательские массовые действия к различным спискам.
Регистрация пользовательского массового действия
from wagtail.admin.views.bulk_action import BulkAction
from wagtail.core 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 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="noopener noreferrer">{{ item.item.title }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock items_with_access %}
{% block items_with_no_access %}
{% blocktrans 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="noopener 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.core 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.core 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.core 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.core import hooks
@hooks.register('register_bulk_action')
class CustomUserBulkAction(UserBulkAction):
...
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/extending/custom_bulk_actions.html