Добавление отчетов
Отчеты представляют собой представления со списком страниц, соответствующих определенному запросу. Они также могут экспортировать эти списки в формате электронных таблиц. Их можно найти в подменю Reports: по умолчанию предоставляется отчет Locked Pages, позволяющий просмотреть заблокированные страницы на сайте.
Возможна разработка собственных пользовательских отчетов в административной панели 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/v3.0.3/extending/adding_reports.html