Похоже, у 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:')