Django 1.11:如何阻止MultipleChoiceField自动选中空值
解决Django 1.11 MultipleChoiceField默认选中空选项的问题
嘿,我明白你遇到的困扰:你的MultipleChoiceField里加了(u'', '(no extra)')这个空值选项,但页面一加载它就自动被选中了,这完全不是你想要的效果——你希望初始状态下没有任何选项被勾选。
问题出在哪?
正常来说,当MultipleChoiceField设置了required=False,而且没指定initial值时,默认初始值是空列表[],不会选中任何选项。出现自动选中空选项的情况,多半是这几个原因:
- 表单初始化时,不管是你手动设置还是Django隐式处理,
initial被设成了包含空字符串''的列表; - 如果这是绑定模型的
ModelForm,那模型字段的默认值或者当前实例的字段值可能包含''; - 极少数情况是模板渲染时的意外,但这种情况很少见。
解决办法来了
这里有几个靠谱的方法,帮你搞定这个问题:
1. 强制把初始值设为空列表
在表单的__init__方法里,直接指定字段的初始值是空列表,覆盖任何隐式的默认设置:
class YourForm(forms.Form): choices = [(u'', '(no extra)'), (u'cheese', u'Cheese'), (u'Pepper', u'Pepper')] extra_topics = forms.MultipleChoiceField(required=False, choices=choices) def __init__(self, *args, **kwargs): super(YourForm, self).__init__(*args, **kwargs) # 显式设置初始值为空列表,确保没有选项被默认勾选 self.fields['extra_topics'].initial = []
2. 检查模型字段的默认值(如果是ModelForm)
如果这是ModelForm,先看看对应模型字段的default设置。比如要是模型字段是这么写的:
extra_topics = models.CharField(choices=..., default='')
或者是支持多选的字段(比如ArrayField)默认值包含空字符串,那你要么修改模型的default为[](对应字段类型调整),要么就在表单里覆盖初始值,用上面的方法就行。
3. 可选:调整空选项的位置
虽然这不是直接解决默认选中的办法,但要是把空选项移到choices的最后,就算不小心默认选中了,也更符合用户的使用习惯。不过还是更推荐前面的方法,从根儿上解决问题。
怎么验证有没有生效?
修改完之后,你可以直接实例化表单,打印字段的初始值看看:
form = YourForm() print(form.fields['extra_topics'].initial) # 正常应该输出 []
这样就能保证页面加载时,包括空值选项在内的所有选项,都不会被自动选中啦。
内容的提问来源于stack exchange,提问作者Azd325
相关产品推荐
相关产品推荐

