【问题标题】:How to define custom template for Wagtail streamfield Document block?如何为 Wagtail 流域文档块定义自定义模板?
【发布时间】:2021-11-15 04:44:15
【问题描述】:

我们有一个使用StreamField 定义的模型,它允许DocumentChooserBlock,如下所示:

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

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

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

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

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

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

【问题讨论】:

    标签: wagtail wagtail-streamfield


    【解决方案1】:

    template 参数传递给 DocumentChooserBlock:

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

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

    【讨论】:

    • 是否有必要/可能检查文档 MIME 类型?例如,在可能存在各种文档格式的情况下。
    • 我会试试document.content_type 属性:github.com/wagtail/wagtail/blob/…
    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多