Django表单模板中如何将select控件值设为上次请求提交值
Django Select字段提交后无法回显选中状态的问题解决
问题描述
我手动编写了Django表单模板,希望保持自定义的渲染方式:text字段通过{{ form.field.value }}能正常回显上次提交的值,但select字段却无法实现相同效果。尝试用循环choices的方式设置选中状态时,只有通过form = SomeForm(initial={'assigned_employee': 20180011})设置初始值时生效;表单提交后form.assigned_employee.value明明有返回值,但判断条件{% if form.assigned_employee.value == id %} selected{% endif %}始终为false。
原因分析
核心问题是类型不匹配:
- 当你用
initial设置初始值时,传入的是整数20180011,此时form.assigned_employee.value的类型也是整数,和循环中choices里的id(整数类型)一致,所以判断生效。 - 但表单提交后,浏览器传递的参数都是字符串类型,Django会把
form.assigned_employee.value解析成字符串,而循环中的id还是整数类型。Python中字符串和整数直接比较永远不相等,这就导致你的判断条件始终返回false。
解决方法
只需要把比较的双方转换成同一类型即可,这里提供几种实用的模板写法:
方法一:将id转为字符串后比较
把循环中的id转换成字符串,和form.assigned_employee.value(字符串类型)直接对比:
{% for id, name in form.fields.assigned_employee.choices %} <option value="{{ id }}"{% if form.assigned_employee.value == id|stringformat:"s" %} selected{% endif %}>{{ name }}</option> {% endfor %}
方法二:将form字段值转为整数后比较
把form.assigned_employee.value转换成整数,和循环中的id(整数类型)对比:
{% for id, name in form.fields.assigned_employee.choices %} <option value="{{ id }}"{% if form.assigned_employee.value|add:"0" == id %} selected{% endif %}>{{ name }}</option> {% endfor %}
注:
add:"0"是利用模板过滤器的特性,把字符串数字转成整数,如果value不是合法数字可能会有问题,但这里是表单提交的合法值,所以可以放心用。
方法三:使用with标签提前转换类型
如果需要更清晰的代码,可以用with标签提前把id转成字符串:
{% for id, name in form.fields.assigned_employee.choices %} {% with id_str=id|stringformat:"s" %} <option value="{{ id }}"{% if form.assigned_employee.value == id_str %} selected{% endif %}>{{ name }}</option> {% endwith %} {% endfor %}
内容的提问来源于stack exchange,提问作者Shateel Ahmed
相关产品推荐
相关产品推荐

