【问题标题】:django escapes widget when rendering formdjango 在渲染表单时转义小部件
【发布时间】:2011-06-24 19:10:09
【问题描述】:

我创建了一个自定义小部件和一个使用它的表单。 以前,我在调试时只有一个简单的模板来显示表单:

<form>
    {{ run_form.as_p }}
</form>

现在我想将每个表单字段包含在一个 div 中,所以我将模板更改为

{% for field in form %}
      <div class="fieldWrapper">
           {{ field.errors }}
           {{ field.label_tag }}: {{ field }}
      </div>
{% endfor %}

但现在看来,当我的字段被渲染时,它的所有字符都是 html 转义的,所以现在当我查看它的源代码时,它看起来像 &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;id_scriptscrap&amp;quot;/&amp;gt 它应该在哪里 &lt;input type="text" id="id_scriptscrap"/&gt;.

我有什么遗漏吗?为什么第一个模板会输出而不转义,而第二个模板会转义?也许我在创建自定义小部件类时做错了什么?

【问题讨论】:

    标签: django escaping widget


    【解决方案1】:

    也许我在创建自定义小部件类时做错了什么?

    可能,尽管由于您没有发布代码而无法判断。

    form.as_p 起作用的原因是form._html_output() 方法——这是各种as_foo 方法使用的方法——在其输出上调用mark_safe。然而,每个内置的小部件类在它们自己的输出上调用mark_safe,这就是它们单独工作的原因。您可能只需要在您的自定义小部件上执行相同的操作。

    【讨论】:

    • 谢谢,就是这样。只是为了向未来的读者澄清:) - 小部件的 render() 方法返回了一个没有用 mark_safe() 标记的字符串,因此模板转义了它。
    【解决方案2】:

    其他原因:如果您不小心用小部件而不是字段定义表单,也会发生这种情况(例如 password = forms.PasswordInput 而不是 password = forms.CharField(widget=forms.PasswordInput)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2013-02-25
      • 2017-09-25
      • 2012-08-06
      • 2019-05-29
      相关资源
      最近更新 更多