首页 > 解决方案 > 如何为 Wagtail 流域文档块定义自定义模板?

问题描述

我们有一个用 a 定义的模型,StreamField它允许 aDocumentChooserBlock如下:

class CustomPage(Page):
    body = StreamField(
        [("document", DocumentChooserBlock()),]
    ...

我们的页面模板CustomPage.body如下呈现该字段:

{% block content %}
    ...
    {% include_block page.body %}
    ...
{% endblock %}

默认情况下,通过渲染上传的 PDF 文档StreamField呈现为链接。

如何覆盖 中文档链接的呈现输出CustomPage.body StreamField,以便我可以根据 JavaScript PDF 小部件呈现 PDF?

如果这是一个常见的需求,我将有兴趣发布 Wagtail 扩展以供其他项目使用。

标签: wagtailwagtail-streamfield

解决方案


将参数传递template给 DocumentChooserBlock:

class CustomPage(Page):
    body = StreamField(
        [("document", DocumentChooserBlock(template='myapp/blocks/document.html')),]

或者,如果您要在多个地方使用它,请将 DocumentChooserBlock 子类化并template在其内部 Meta 类中设置,然后使用该新类代替 DocumentChooserBlock:

class DocumentEmbedBlock(DocumentChooserBlock):
    class Meta:
        template = 'myapp/blocks/document.html'


class CustomPage(Page):
    body = StreamField(
        [("document", DocumentEmbedBlock()),]

在模板中,value将引用 Document 对象,因此您可以通过{{ value.url }}或引用文档的属性{{ value.title }}

<h2>{{ value.title }}</h2>
<iframe src="{{ value.url }}"></iframe>

推荐阅读