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

Wagtail自定义StructBlock后台模板报错及渲染异常求助

解决Wagtail StructBlock自定义模板的迭代与HTML转义问题

看起来你遇到的问题根源在于使用了Jinja2模板引擎,而Wagtail默认的模板是为Django模板语法设计的,两者在方法调用和HTML转义处理上有差异。让我们一步步解决:

1. 为什么会出现「'builtin_function_or_method' object is not iterable」错误?

在Django模板中,无参方法会被自动调用(比如children.values会自动执行values()方法),但Jinja2要求必须显式添加括号来调用方法。你之前写的children.values拿到的是方法本身,而不是可迭代的子表单集合,自然会报错。

2. 为什么改成children.values()后显示HTML字符串而非输入框?

Jinja2默认会对所有变量输出做HTML转义,防止XSS风险。child.render_form返回的是原始HTML代码,但Jinja2不知道这是安全内容,所以把它转义成了纯文本显示。

解决方案:修改自定义模板

把你的section_settings.html模板调整成下面这样:

<div class="{{ classname }}">
    {% if help_text %}
        <div class="object-help help">{{ help_text }}</div>
    {% endif %}
    <ul class="fields">
        {% for child in children.values() %}
            <li{% if child.block.required %} class="required"{% endif %}>
                {% if child.block.label %}
                    <label{% if child.id_for_label %} for="{{ child.id_for_label }}"{% endif %}>{{ child.block.label }}:</label>
                {% endif %}
                {{ child.render_form|safe }}
            </li>
        {% endfor %}
    </ul>
</div>

关键修改点:

  • 把children.values改成children.values()(Jinja2中必须显式调用方法)
  • 给child.render_form添加|safe过滤器,告诉Jinja2这个HTML内容是安全的,不需要转义

另外,再确认一下你的StructBlock定义中form_template的路径是否正确,确保Django能正确找到这个自定义模板文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:17:36