首页 > 解决方案 > Django 表单使用无效的 HTML 语法呈现

问题描述

我有一个使用集成表单的 Django 项目。但它向我的客户发送了错误的 HTML 语法。这应该没什么大不了的,因为现在的浏览器会清理这些错误。但是,当表单被发送回服务器时,表单无法验证,因为 Firefox 会发回清理后的版本。

我有一个带有多项选择的表单:

class ProjectForm(forms.Form):

    # [...]
    project_leaders = forms.ModelChoiceField(widget=forms.SelectMultiple, queryset=User.objects.all(), initial=0)

此表单集成在相应的 html 文件中:

{{ project_form.as_p | linebreaks }}

这是它的源代码(通过 Firefox Page Source):

<p>[...] <select name="project_leaders" required id="id_project_leaders" multiple><br>
<option value="test">test</option></p>
<p></select></p>

Firefox 会清理 oc 但它应该被 django 发送和接受。有谁知道我怎么能 django 做到这一点?

标签: htmldjango

解决方案


这应该没什么大不了的,因为现在的浏览器会清理这些错误。

浏览器尽力从错误的标记中提取一些含义,但结果并不总是作者所期望的。为了获得所需的结构,作者应该编写正确的 HTML。这种情况自 90 年代以来一直没有改变。

在这种特定情况下,我的建议是去掉| linebreaksfilter。它适用于带有最简单格式标签的纯文本。

过滤器<br>在开始<select>标签后添加一个。这会导致浏览器自动关闭<select>再次,因为<br>s 在 s 内部无效<select>。然后将<option>元素放置在 之外<select>,不再有任何效果。关闭和重新打开<p>标签是浏览器不完全知道如何处理最后一个流浪者的症状</select>


推荐阅读