You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HomePage字段变量传入Stream StructBlock并渲染展示

解决方法:在StructBlock模板中调用页面模型字段

核心问题

Block模板里的{{ self }}指向的是StructBlock实例(即你定义的FooterPlus里的tlf、email字段),而非HomePage模型对象,所以直接写{{ self.facebook_link }}无法获取到页面字段值。要访问页面数据,必须先拿到当前页面对象。


方法一:渲染StreamField时传递页面上下文

假设你的HomePage模型已定义包含FooterPlus的StreamField(若未定义,先按以下代码补充):

# home/models.py
from wagtail.fields import StreamField
from streams.blocks import FooterPlus

class HomePage(Page):
    # ... 原有字段 ...
    body = StreamField([
        ('footer_plus', FooterPlus()),
    ], use_json_field=True)

    content_panels = Page.content_panels + [
        # ... 原有面板 ...
        FieldPanel('body'),
    ]

在HomePage模板home/home_page.html里渲染StreamField时,显式传递page变量:

{% for block in page.body %}
    {% include block.template with block=block page=page %}
{% endfor %}

此时在footer_plus.html中即可直接调用页面字段:

<a href="{{ page.facebook_link }}" class="list-group-item list-group-item-action">Facebook</a>
<a href="{{ page.instagram_link }}" class="list-group-item list-group-item-action">Instagram</a>
<a href="{{ page.twitter_link }}" class="list-group-item list-group-item-action">Twitter</a>
<a href="{{ page.youtube_link }}" class="list-group-item list-group-item-action">YouTube</a>

调用Logo图片

先在模板开头加载Wagtail图片标签,再渲染图片:

{% load wagtailimages_tags %}

<!-- 基础用法:指定宽度 -->
{% image page.logo_image width-150 %}

<!-- 自定义尺寸与样式 -->
{% image page.logo_image fill-200x80 class="img-fluid" alt="网站Logo" %}

方法二:在Block类中主动获取页面上下文

若不想修改页面模板的渲染逻辑,可在StructBlock的get_context方法中提取页面对象:

# streams/blocks.py
from wagtail.blocks import StructBlock

class FooterPlus(blocks.StructBlock):
    tlf = blocks.CharBlock(required=True, max_length=20, label="Tlf", default="+58")
    email = blocks.CharBlock(required=True, max_length=20, label="Email", default="")

    def get_context(self, value, parent_context=None):
        context = super().get_context(value, parent_context)
        # 从父上下文获取当前页面并传入Block模板
        if parent_context and 'page' in parent_context:
            context['page'] = parent_context['page']
        return context

    class Meta:
        template = "streams/parts/footer_plus.html"
        icon = "plus"
        label = "Footer plus"

完成后无需修改页面模板,直接在footer_plus.html中使用{{ page.facebook_link }}和图片标签即可,写法与方法一完全一致。


注意事项

  • 确认HomePage模型已正确配置包含FooterPlus的StreamField,并添加到内容面板中
  • 使用图片渲染时,必须先加载wagtailimages_tags模板标签
  • 调试时可先输出{{ page }},确认是否成功获取到页面对象

内容的提问来源于stack exchange,提问作者Squall32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:15:53