在Django的“Select”小部件中显示“Please choose:”

时间:2011-04-02 09:24:39

标签: python django validation forms

我正在创建一个Django表单并使用ChoiceField生成一个带有不同选项的<select>框。我希望<select>框的第一个选项是“请选择:”,如果用户提交表单而不选择,则会收到错误。

这样做的好方法是什么?

1 个答案:

答案 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:')