我正在创建一个Django表单并使用ChoiceField
生成一个带有不同选项的<select>
框。我希望<select>
框的第一个选项是“请选择:”,如果用户提交表单而不选择,则会收到错误。
这样做的好方法是什么?
答案 0 :(得分:4)
似乎Django没有内置支持这样的请求。您可以通过继承ChoiceField
并使其接受blank_choice
参数来实现它。 e.g。
from django import forms
class ChoiceField(forms.ChoiceField):
def __init__(self, *args, **kwargs):
self.blank_choice = kwargs.pop('blank_choice', None)
super(ChoiceField, self).__init__(*args, **kwargs)
def _get_choices(self):
return self._choices
def _set_choices(self, value):
choices = list(value)
if self.blank_choice:
choices = [('', self.blank_choice)] + choices
self._choices = self.widget.choices = choices
choices = property(_get_choices, _set_choices)
此空白选项前置于正常的选项集,并被视为空值。 (这就是为什么我使用None
作为与self.blank_choice
选项关联的值,因为它位于django.core.validators.EMPTY_VALUES
元组中。
要使用它,请使用此ChoiceField
而不是Django提供的值,并传入blank_choice
的值,例如
from django import forms
from myproject.formfields import ChoiceField
NAMES = (
('brad', 'Brad'),
('sam', 'Sam'),
)
class MyForm(forms.Form):
names = ChoiceField(choices=NAMES, blank_choice='Please choose:')