Django 2及2.0.1版本模板表单问题:{{form.field}}失效
嘿,我之前在老版本Django里也碰到过类似的小坑,咱们来一步步排查解决:
首先先确认下问题:你用{{ form }}渲染整个表单时一切正常,但单独用{{ form.field }}(比如{{ form.cliente }})渲染单个字段时,页面上完全看不到对应的表单元素,对吧?
先排查几个最常见的原因:
字段名拼写错误
这是最容易犯的低级错误!你要确保模板里写的字段名和forms.py中fields列表里的名称完全一致,包括大小写(比如cliente不能写成Cliente或者client)。可以先在模板里临时加一行{{ form }},查看渲染后的HTML里每个字段的name属性,和你要单独渲染的字段名比对一下。HTML语法错误干扰
看你提供的模板代码,<form>标签里写了两个method="POST"属性,这是无效的HTML语法!虽然这不会直接导致字段消失,但可能干扰模板解析,先修正成:<form method="POST" class="post-form">元素被CSS隐藏
有时候字段其实已经渲染出来了,但被CSS设置成了display: none或者visibility: hidden。打开浏览器的开发者工具(按F12),在Elements面板里搜索对应的字段名(比如cliente),看看有没有对应的<input>标签存在。尝试渲染字段的完整组件
单独写{{ form.field }}有时候可能因为模板上下文的问题没渲染出来,试试渲染字段的完整组合:{{ form.cliente.label_tag }} <!-- 字段标签 --> {{ form.cliente }} <!-- 输入框 --> {{ form.cliente.errors }} <!-- 错误提示 -->这样能更清楚看到哪部分出了问题。
针对Django 2.0.1版本的特殊排查
Django 2.0系列已经停止维护了,2.0.1更是比较早期的版本,可能存在一些已知的小bug。如果上面的方法都没用,建议先升级到2.0系列的最新版本(比如2.0.13),很多这类小问题在后续补丁里都被修复了。
修正后的模板示例
这里给你一个完整的单个字段渲染的模板参考:
<form method="POST" class="post-form"> {% csrf_token %} <!-- 单个字段渲染示例 --> <div class="form-group"> {{ form.cliente.label_tag }} {{ form.cliente }} {% if form.cliente.errors %} <div class="text-danger">{{ form.cliente.errors }}</div> {% endif %} </div> <!-- 其他字段依次类推 --> <div class="form-group"> {{ form.prestazione1.label_tag }} {{ form.prestazione1 }} {% if form.prestazione1.errors %} <div class="text-danger">{{ form.prestazione1.errors }}</div> {% endif %} </div> <input type="submit" id="salva" class="btn btn-primary" /> </form>
内容的提问来源于stack exchange,提问作者Ro0t

