【问题标题】:Remove unwanted th, td and tr tags from Django generated form从 Django 生成的表单中删除不需要的 th、td 和 tr 标签
【发布时间】:2020-12-06 21:03:25
【问题描述】:

我在导航栏中完成了一个带有搜索表单的拍卖应用程序。

搜索表单模型在我的 forms.py 文件中(它不是 ModelForm,因为我不需要将搜索表单数据保存在任何数据库模型中):

class SearchForm(forms.Form):
    search = forms.CharField(label="",
                            min_length=1,
                            max_length=50,
                            widget=forms.TextInput
                            (attrs={'class':'form-control mr-sm-2',
                            'placeholder':'Name or category',
                            'type':'search',
                            'aria-label':'Search'
                            }))

表单在我的 layout.html 中呈现如下:

<form class="form-inline my-2 my-lg-0" action="{% url 'auctions:search' %}" method="POST">
                    {% csrf_token %}
                    {{ searchform }}
                    <button class="btn btn-outline-light my-2 my-sm-0" type="submit">Search</button>
</form>

搜索表格:

渲染出来的表单没有问题(样式和我想要的一样),但是当我查看渲染页面的源代码时,有一些不合适的 tr、td 和 th 标签:

<form class="form-inline my-2 my-lg-0" action="/search" method="POST">
                    <input type="hidden" name="csrfmiddlewaretoken" value="glVkeNbCkWjiInGZ2cwORkXSu48otl5TPnJAAGxzdhzzdKFSSMxJVyRk9oK0HNmk">
                    <tr><th><label for="id_search">Search:</label></th><td><input type="search" name="search" class="form-control mr-sm-2" placeholder="Name or category" aria-label="Search" maxlength="50" minlength="1" required id="id_search"></td></tr>
                    <button class="btn btn-outline-light my-2 my-sm-0" type="submit">Search</button>
</form>

我尝试像这样在我的 views.py 中设置label_suffix="",它会删除标签标签,但不会删除 tr、td 和 th 标签:

return render(request, "auctions/index.html", {
    "auctions": auctions,
    "searchform": SearchForm(label_suffix="")
})

这些标签导致 W3C 验证器出错,所以我对这个问题有几个问题:

1 .那很重要么 ?我是编程新手,我不知道这是否会导致我的应用出现严重问题。

2 。是 Django 表单还是 Bootstrap 样式造成的?

3 .有没有办法去掉这些标签?

感谢您的帮助,

最好的问候,

【问题讨论】:

    标签: html django twitter-bootstrap bootstrap-4 w3c


    【解决方案1】:

    谢谢@kerasbaz,起初我尝试使用 form.as_p 并且遇到了一些样式问题,然后我在文档中找到了这个:

    https://docs.djangoproject.com/en/3.1/topics/forms/#rendering-fields-manually

    所以我在 layout.html 中将{{ searchform }} 更改为{{ searchform.search }},问题就解决了。

    感谢您的帮助,

    【讨论】:

      【解决方案2】:
      1. 遵守标准的重要性问题完全取决于您。大多数浏览器都会处理结果,即使没有父 &lt;table&gt; 标记(我认为 W3C 验证指向的是什么?)。
      2. 这不是引导程序。有&lt;tr&gt;&lt;th&gt; 标签被添加到您的HTML 中,这意味着这是来自django 的输出(将引导程序视为主要是CSS)。在这种情况下,在我看来这些标签是由 forms.Form 类(或相关模板)添加的
      3. 您可以使用django's built-in form rendering options 删除标签。例如,您可以将 {{ searchform }} 更改为 {{ searchform.as_p }} 以用于使用

        而不是类似的表单。

      要点是您需要阅读上面链接的表单渲染文档。

      【讨论】: