我如何定制Wagtail页面复印体验?

问题描述 投票:5回答:1

我有一些自定义逻辑(复杂的唯一性约束验证),我想检查用户何时尝试在Wa中复制(或移动)某种类型的页面。我还想给用户一个机会来更改与验证检查关联的字段。

我知道Wagtail公开了一种通过钩子(http://docs.wagtail.io/en/stable/reference/hooks.html#before-copy-page)自定义复制(和移动)体验的方式,但是使用该工具最好的办法是创建一个全新的界面并返回它在HttpResponse中。有没有一种方法可以仅针对特定页面类型自定义现有的复制(和移动)界面?

@hooks.register('before-copy-page')
def before-copy-page(request, page):
    return HttpResponse("New copy interface", content_type="text/plain")
customization wagtail
1个回答
0
投票

这三种方法可让您更深入地了解Wagtail页面副本的视图和验证。您可能不需要全部执行这三个操作,但是下面的示例代码假定所有更改都已在一定程度上完成。

也许有更好的方法来完成您想要的事情,但是希望这为您提供了一些方法来定制整个副本视图/表单交互的一部分。

这些方法应该适用于移动页面交互,但是还有更多的表单和视图。

概述

1。覆盖页面复制模板

  • Wagtail提供了一种轻松实现override any admin templates的方法。
  • templates/wagtailadmin/pages/copy.html处添加模板将覆盖copy page form template
  • 我们还可以通过在顶部添加{% extends "wagtailadmin/pages/copy.html" %}来轻松扩展复制页面的原始模板,这省去了我们不得不复制/粘贴页面的大部分内容并仅自定义所需块的麻烦。
  • 如果只想在模板中块的开头或结尾添加一些内容,请记住{{ block.super }}可能会派上用场。
  • 在下面的示例代码中,我复制了整个内容块(在以后的发行版中将需要维护)并添加了一个自定义字段。

2。覆盖URL并查看页面副本

  • 在您的urls.py中,应将其配置为包括Wagtail urls
  • admin/网址上方添加新的URL路径,将首先访问它。
  • 例如,url(r'^admin/pages/(\d+)/copy/$', base_views.customCopy, name='copy'),,这会将管理员副本页面定向到我们的customCopy视图。
  • 此视图可以是函数视图或类视图,可以完全自定义整个视图(和模板)或仅部分定制。
  • 这里使用的Wagtail视图是一个功能视图,因此无法轻松复制,因此您的自定义在这里受到了一些限制。
  • 您可以在admin/views/pages.py中看到此视图的源。

3。猴子补丁Wa CopyForm

  • 这可能并不理想,但是您可以始终monkey patch CopyForm并自定义其__init__clean方法(或根据需要其他任何方法。)>
  • 您可以查看CopyForm的源以查看需要修改的内容,如果您想向表单添加字段,则需要这样做(以及模板更改)。
  • 代码

((1)模板/wagtailadmin/pages/copy.html
CopyForm

((2)urls.py
{% extends "wagtailadmin/pages/copy.html" %}
{% load i18n %}
{% block content %}
    {% comment %} source - wagtail/admin/templates/wagtailadmin/pages/copy.html {% endcomment %}
    {% trans "Copy" as copy_str %}
    {% include "wagtailadmin/shared/header.html" with title=copy_str subtitle=page.get_admin_display_title icon="doc-empty-inverse" %}

    <div class="nice-padding">
        <form action="{% url 'wagtailadmin_pages:copy' page.id %}" method="POST" novalidate>
            {% csrf_token %}
            <input type="hidden" name="next" value="{{ next }}" />

            <ul class="fields">
                {% include "wagtailadmin/shared/field_as_li.html" with field=form.new_title %}
                {% include "wagtailadmin/shared/field_as_li.html" with field=form.new_slug %}
                {% include "wagtailadmin/shared/field_as_li.html" with field=form.new_parent_page %}

                {% if form.copy_subpages %}
                    {% include "wagtailadmin/shared/field_as_li.html" with field=form.copy_subpages %}
                {% endif %}

                {% if form.publish_copies %}
                    {% include "wagtailadmin/shared/field_as_li.html" with field=form.publish_copies %}
                {% endif %}
                {% comment %} BEGIN CUSTOM CONTENT {% endcomment %}
                {% include "wagtailadmin/shared/field_as_li.html" with field=form.other %}
                {% comment %} END CUSTOM CONTENT {% endcomment %}
            </ul>

            <input type="submit" value="{% trans 'Copy this page' %}" class="button">
        </form>
    </div>
{% endblock %}

((2&3)views.py
from django.conf.urls import include, url
from django.contrib import admin

from wagtail.admin import urls as wagtailadmin_urls
from wagtail.admin.views import pages
from wagtail.documents import urls as wagtaildocs_urls
from wagtail.core import urls as wagtail_urls

from myapp.base import views as base_views  # added

urlpatterns = [
    url(r'^django-admin/', admin.site.urls),
    url(r'^admin/pages/(\d+)/copy/$', base_views.customCopy, name='copy'),  # added
    url(r'^admin/', include(wagtailadmin_urls)),
    url(r'^documents/', include(wagtaildocs_urls)),
    url(r'', include(wagtail_urls)),
]

© www.soinside.com 2019 - 2024. All rights reserved.