【发布时间】:2011-07-28 04:45:37
【问题描述】:
我正在制作一个 Django 表单并使用 ChoiceField 生成一个带有不同选项的 <select> 框。我希望<select> 框的第一个选项是“请选择:”,如果用户在没有选择的情况下提交表单,他会收到错误。
什么是这样做的好方法?
【问题讨论】:
标签: python django validation forms
我正在制作一个 Django 表单并使用 ChoiceField 生成一个带有不同选项的 <select> 框。我希望<select> 框的第一个选项是“请选择:”,如果用户在没有选择的情况下提交表单,他会收到错误。
什么是这样做的好方法?
【问题讨论】:
标签: python django validation forms
似乎 Django 没有对此类请求的内置支持。您可以通过继承ChoiceField 并使其接受blank_choice 参数来实现它。例如
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:')
【讨论】:
_set_choices 方法)。为什么?