如何将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
相关产品推荐
相关产品推荐

