Django 2.0升级后模板报BoundField类型错误求助
解决Django 2.0升级后Formset模板报错:sequence item 5: expected str instance, BoundField found
这个问题我之前帮同事排查过,本质是Django 2.0对模板中的类型检查更严格了——在1.11版本里,模板会悄悄把BoundField(表单字段的实例)转换成字符串,但2.0取消了这个自动转换,当你试图把BoundField和普通字符串直接拼接时,就会抛出类型不匹配的错误。
问题定位
你需要检查模板中所有涉及formset字段和字符串拼接的地方,常见场景包括:
- 用
+直接拼接字段和字符串(比如{{ form.my_field }}_extra) - 在
{% with %}标签里把字段和字符串组合成新变量 - 自定义HTML属性时直接引用字段实例而非其字符串属性
修复方案
针对不同场景,有对应的解决办法:
- 显式转换BoundField为字符串
如果需要把字段本身和字符串拼接,用stringformat过滤器强制转成字符串:
<td>{{ form.my_field|stringformat:"s" }}_suffix</td>
- 引用字段的字符串属性而非字段实例
大部分表单字段都有自带的字符串属性,比如:
- 字段ID:
form.my_field.id_for_label(本身就是字符串) - 字段名称:
form.my_field.name - 字段值:
form.my_field.value
比如原来错误的写法:
{% with custom_id=form.my_field + "_custom" %} <input id="{{ custom_id }}" ...> {% endwith %}
改成:
{% with custom_id=form.my_field.id_for_label|add:"_custom" %} <input id="{{ custom_id }}" ...> {% endwith %}
这里用add过滤器来拼接字符串,而不是直接用+。
- 分开输出字段和字符串
如果只是在字段后面追加文字,完全不需要拼接,直接分开写就行:
<td>{{ form.my_field }} <span>(必填)</span></td>
针对你的模板片段
看你给出的<table>代码,大概率是在循环formset表单时,某个单元格里的字段和字符串做了隐式拼接。你可以重点检查{% for form in formset %}循环体内的代码,找到所有直接把form.xxx和字符串放在一起的地方,按上面的方法修正。
内容的提问来源于stack exchange,提问作者Elroum
相关产品推荐
相关产品推荐

