如何为 Wagtail streamfield 文档块定义自定义模板?

How to define custom template for Wagtail streamfield Document block?

我们有一个定义了 StreamField 的模型,它允许 DocumentChooserBlock 如下:

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

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

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

默认情况下,通过 StreamField 上传的 PDF 文档呈现为 link。

如何覆盖 CustomPage.body StreamField 中文档 link 的呈现输出,以便我可以呈现与 JavaScript PDF 一致的 PDF小部件?

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

template 参数传递给 DocumentChooserBlock:

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

或者,如果您要在多个地方使用它,subclass DocumentChooserBlock 并在其内部 Meta class 中设置 template,然后使用新的 class 代替 DocumentChooserBlock:

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


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

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

引用文档的属性
<h2>{{ value.title }}</h2>
<iframe src="{{ value.url }}"></iframe>