Добавление отчётов
Отчёты представляют собой представления со списками страниц, соответствующих определённому запросу. Они также могут экспортировать эти списки в формате электронных таблиц. Их можно найти в подменю Отчёты: по умолчанию предоставляется отчёт Заблокированные страницы, позволяющий получить обзор заблокированных страниц на сайте.
Можно создать собственные пользовательские отчёты в админ-панели Wagtail. Предоставляются два базовых класса: wagtail.admin.views.reports.ReportView, который обеспечивает базовые функции отображения списка и экспорта в электронную таблицу, и wagtail.admin.views.reports.PageReportView, который дополнительно предоставляет набор полей по умолчанию, подходящих для списков страниц. В этом примере мы добавим отчёт, который показывает все страницы с не опубликованными изменениями.
# <project>/views.py
from wagtail.admin.views.reports import PageReportView
class UnpublishedChangesReportView(PageReportView):
pass
Определение отчёта
Наиболее важные атрибуты и методы для настройки определения отчёта:
Это извлекает набор страниц для вашего отчёта. Для нашего примера:
# <project>/views.py
from wagtail.admin.views.reports import PageReportView
from wagtail.models import Page
class UnpublishedChangesReportView(PageReportView):
def get_queryset(self):
return Page.objects.filter(has_unpublished_changes=True)
(строка)
Шаблон, используемый для отображения вашего отчёта. Для ReportView, по умолчанию используется "wagtailadmin/reports/base_report.html", который предоставляет пустой макет страницы отчёта; для PageReportView, по умолчанию используется "wagtailadmin/reports/base_page_report.html", который предоставляет список, основанный на представлениях проводника, отображающий кнопки действий, а также заголовок, время последнего обновления, статус и тип любых страниц. В этом примере мы изменим это на новый шаблон в последующем разделе.
(строка)
Название вашего отчёта, которое будет отображаться в заголовке. Для нашего примера мы установим его на "Pages with unpublished changes".
(строка)
Имя значка, используя стандартные имена значков Wagtail. Например, представление заблокированных страниц использует "locked", а для нашего примера отчёта мы установим его на 'doc-empty-inverse'.
Экспорт в электронные таблицы
(список)
Список полей/атрибутов для каждой модели, которые экспортируются как столбцы в представлении электронных таблиц. Для ReportView, по умолчанию это пусто, а для PageReportView, это соответствует полям списка: заголовок, время последнего обновления, статус и тип страниц. Для нашего примера, мы можем захотеть узнать, когда страница была в последний раз опубликована, поэтому мы установим list_export следующим образом:
list_export = PageReportView.list_export + ['last_published_at']
(словарь)
Словарь любых полей/атрибутов в list_export, для которых вы хотите вручную указать заголовок для столбца электронной таблицы и их заголовки. Если не указано, заголовок будет взят из поля verbose_name если применимо, и строка атрибута в противном случае. Для нашего примера, last_published_at автоматически получит заголовок "Last Published At", но «Последнее опубликование» выглядит более аккуратно. Мы добавим это, установив export_headings:
export_headings = dict(last_published_at='Last Published', **PageReportView.export_headings)
(словарь)
Словарь кортежей (value_class_1, value_class_2, ...) отображающих словари {export_format: preprocessing_function}, позволяющие применять пользовательские функции предварительной обработки при экспорте значений полей определённых классов (или их подклассов). Если не указано (и ReportView.custom_field_preprocess также не указывает функцию), будет использоваться force_str. Для предотвращения предварительной обработки установите preprocessing_function на None.
(словарь)
Словарь строк field_name отображающих словари {export_format: preprocessing_function}, позволяющие применять пользовательские функции предварительной обработки при экспорте значений полей определённых классов (или их подклассов). Это будет иметь приоритет над функциями, указанными в ReportView.custom_value_preprocess. Если не указано (и ReportView.custom_value_preprocess также не указывает функцию), будет использоваться force_str. Для предотвращения предварительной обработки установите preprocessing_function на None.
Настройка шаблонов
Для этого примера отчёта «страницы с не опубликованными изменениями» мы добавим дополнительный столбец в шаблон списка, показывающий последнюю дату публикации каждой страницы. Для этого мы расширим два шаблона: wagtailadmin/reports/base_page_report.html, и wagtailadmin/reports/listing/_list_page_report.html.
{# <project>/templates/reports/unpublished_changes_report.html #}
{% extends 'wagtailadmin/reports/base_page_report.html' %}
{% block listing %}
{% include 'reports/include/_list_unpublished_changes.html' %}
{% endblock %}
{% block no_results %}
<p>No pages with unpublished changes.</p>
{% endblock %}
{# <project>/templates/reports/include/_list_unpublished_changes.html #}
{% extends 'wagtailadmin/reports/listing/_list_page_report.html' %}
{% block extra_columns %}
<th>Last Published</th>
{% endblock %}
{% block extra_page_data %}
<td valign="top">
{{ page.last_published_at }}
</td>
{% endblock %}
Наконец, мы установим UnpublishedChangesReportView.template_name на этот новый шаблон: 'reports/unpublished_changes_report.html'.
Полный код
# <project>/views.py
from wagtail.admin.views.reports import PageReportView
from wagtail.models import Page
class UnpublishedChangesReportView(PageReportView):
header_icon = 'doc-empty-inverse'
template_name = 'reports/unpublished_changes_report.html'
title = "Pages with unpublished changes"
list_export = PageReportView.list_export + ['last_published_at']
export_headings = dict(last_published_at='Last Published', **PageReportView.export_headings)
def get_queryset(self):
return Page.objects.filter(has_unpublished_changes=True)
# <project>/wagtail_hooks.py
from django.urls import path, reverse
from wagtail.admin.menu import AdminOnlyMenuItem
from wagtail import hooks
from .views import UnpublishedChangesReportView
@hooks.register('register_reports_menu_item')
def register_unpublished_changes_report_menu_item():
return AdminOnlyMenuItem("Pages with unpublished changes", reverse('unpublished_changes_report'), classnames='icon icon-' + UnpublishedChangesReportView.header_icon, order=700)
@hooks.register('register_admin_urls')
def register_unpublished_changes_report_url():
return [
path('reports/unpublished-changes/', UnpublishedChangesReportView.as_view(), name='unpublished_changes_report'),
]
{# <project>/templates/reports/unpublished_changes_report.html #}
{% extends 'wagtailadmin/reports/base_page_report.html' %}
{% block listing %}
{% include 'reports/include/_list_unpublished_changes.html' %}
{% endblock %}
{% block no_results %}
<p>No pages with unpublished changes.</p>
{% endblock %}
{# <project>/templates/reports/include/_list_unpublished_changes.html #}
{% extends 'wagtailadmin/reports/listing/_list_page_report.html' %}
{% block extra_columns %}
<th>Last Published</th>
{% endblock %}
{% block extra_page_data %}
<td valign="top">
{{ page.last_published_at }}
</td>
{% endblock %}
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/extending/adding_reports.html