2

我尝试改进我的 wagtail-admin,现在我堆叠,因为无法打开模式窗口。是的,当然,我可以div使用关闭按钮创建一个,但这不是正确的方法。正如我所知道的,有一个特殊的函数(或对象)负责打开这样一个窗口。

wagtail-admin的这种js对象结构没有参考。可能有人知道,怎么做?或者也许我应该忘记它并仅通过香草 javascript 制作我的模态窗口?

4

1 回答 1

6

简短的回答是没有记录的方式来使用现有的 Wagtail 管理模式。

但是,通过查看源代码,可以利用模态工作流来实现您自己的模态。Wagtail 中的方法是让render_modal_workflow.

在客户端,有一个功能可用ModalWorkflow。这将调用 URL 异步并在响应时呈现模态内的 html 内容,它期望由上述render_modal_workflow帮助程序形成的响应。

从这些基础知识中,可以通过按钮触发器、错误处理、渲染回调和基于模态内部值的回调来添加打开行为。

下面是使用这种方法在管理员中呈现模式的方法的最小示例。

例子

1. 渲染一些有按钮作为触发器的html内容

  • 作为示例,我们将在 Wagtail 主页(仪表板)页面上呈现模式。
  • 使用construct_homepage_panels我们可以在页面下方的面板中添加一些 html。
wagtail_hooks.py
from django.utils.safestring import mark_safe
from wagtail.core import hooks

class WelcomePanel:
    order = 110

    def render(self):
        return mark_safe("""
        <section class="panel summary nice-padding">
          <h3>Dashboard Panel Section Title</h3>
          <button data-modal-trigger="some-param">Open Modal</button>
        </section>
        """)

@hooks.register('construct_homepage_panels')
def add_another_welcome_panel(request, panels):
    panels.append(WelcomePanel())

2. 确保加载了modal-workflow JS脚本

  • 默认情况下,只有处理编辑的页面才会加载模态工作流脚本
  • 要将其添加到此特定页面,我们需要覆盖wagtailadmin/home.html模板模板。
  • 我们还将添加一些 jquery 来查找任何具有该data-modal-trigger属性的元素并添加一个onClick将调用我们的ModalWorkflow函数的侦听器。该数据可以与任何其他特定数据一起传递回模态视图。
templates/wagtailadmin/home.html
{% extends "wagtailadmin/home.html" %}
{% load wagtailadmin_tags %}

{% comment %}
    Javascript declaration added to bring in the modal loader, by default it is only available on edit pages
    example of usage - wagtail/search/templates/wagtailsearch/queries/chooser_field.js
{% endcomment %}

{% block extra_js %}
  {{ block.super }}
  <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
  <script type="text/javascript">
    $(function() {
      $('[data-modal-trigger]').on('click', function(element) {
        /* options passed in 'opts':
          'url' (required): initial
          'responses' (optional): dict of callbacks to be called when the modal content
              calls modal.respond(callbackName, params)
          'onload' (optional): dict of callbacks to be called when loading a step of the workflow.
              The 'step' field in the response identifies the callback to call, passing it the
              modal object and response data as arguments
        */
        ModalWorkflow({
          onError: function(error) { console.log('error', error); },
          url: '/admin/modal/?trigger=' + element.target.dataset.modalTrigger
        });
      });
    });
  </script>
{% endblock %}

3.创建视图和url来处理模态请求

  • 确保有一个admin/...我们可以从中请求模态内容的 url
  • 此 url 必须转到返回基于以下响应的响应的视图render_modal_workflow
  • 可以在客户端启动数据,同时对服务器端呈现的模态内容使用普通的 Django 模板响应
views.py
from django.template.response import TemplateResponse

from wagtail.admin.modal_workflow import render_modal_workflow


def modal_view(request):

    return render_modal_workflow(
        request,
        'base/modal.html', # html template
        None, # js template
        {'trigger': request.GET.get('trigger')}, # html template vars
        json_data={'some': 'data'} # js template data
    )

urls.py
from django.conf.urls import url
from .views import modal_view

urlpatterns = [
    url(r'^admin/modal/', modal_view, name='modal'),
    url(r'^admin/', include(wagtailadmin_urls)),
    # ...
]

4. 设置您的模板以呈现模态内容

  • 模态框都使用相同的共享标题模板,这提供了一种使它感觉一致的好方法。
templates/base/modal.html
{% include "wagtailadmin/shared/header.html" with title="Modal Title" icon="no-view" %}

<div class="nice-padding">
    <p>Modal Triggered by {{ trigger }}</p>
</div>

于 2020-05-18T11:24:13.230 回答