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

