Django空标签选择字段

55 投票
10 回答
72166 浏览
提问于 2025-04-17 13:46

怎么让 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();'}))

撰写回答