Django空标签选择字段
怎么让 ChoiceField
的标签像 ModelChoiceField
一样工作呢?有没有办法设置一个 empty_label
,或者至少显示一个空白的选项?
这是我的表单文件:
thing = forms.ModelChoiceField(queryset=Thing.objects.all(), empty_label='Label')
color = forms.ChoiceField(choices=COLORS)
year = forms.ChoiceField(choices=YEAR_CHOICES)
我试过这里提到的解决方案:
Stack Overflow 问题 - 设置 CHOICES = [('','All')] + CHOICES
后,结果出现了内部服务器错误。
Stack Overflow 问题2 - 在我的选项中定义了 ('', '---------'),
,但还是默认选择了列表中的第一个项目,而不是 ('', '---------'),
这个选项。
Gist - 尝试使用这里定义的 EmptyChoiceField
,但在 Django 1.4 中没有成功。
但是这些方法都没能解决我的问题……你们会怎么处理这个问题呢?谢谢你们的建议!
10 个回答
8
你可以试试这个(假设你的选项是元组):
blank_choice = (('', '---------'),)
...
color = forms.ChoiceField(choices=blank_choice + COLORS)
year = forms.ChoiceField(choices=blank_choice + YEAR_CHOICES)
另外,我从你的代码中看不出来这是一个普通表单还是一个模型表单,但如果是后者的话,就不需要在这里重新定义表单字段了(你可以直接在模型字段中包含choices=COLORS和choices=YEAR_CHOICES)。
希望这对你有帮助。
67
可以查看Django 1.11的文档,了解ChoiceField的相关内容。ChoiceField的“空值”被定义为空字符串''
,所以你的元组列表中应该包含一个键为''
,并且可以映射到你想要显示的空值的内容。
### forms.py
from django.forms import Form, ChoiceField
CHOICE_LIST = [
('', '----'), # replace the value '----' with whatever you want, it won't matter
(1, 'Rock'),
(2, 'Hard Place')
]
class SomeForm (Form):
some_choice = ChoiceField(choices=CHOICE_LIST, required=False)
注意,如果你希望表单字段是可选的,可以使用required=False
来避免表单错误。
另外,如果你已经有一个没有空值的CHOICE_LIST,你可以插入一个空值,这样它就会在表单下拉菜单中显示为第一个选项:
CHOICE_LIST.insert(0, ('', '----'))
25
这是我使用的解决方案:
from myapp.models import COLORS
COLORS_EMPTY = [('','---------')] + COLORS
class ColorBrowseForm(forms.Form):
color = forms.ChoiceField(choices=COLORS_EMPTY, required=False, widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))