每当我运行form.is_valid()时,我都会收到错误:
选择有效的选择。这种选择不是可用的选择之一 选择。
以下是我的观点:
timeframes = HostTimeFrame.objects.all()
if request.method == 'POST':
form = SelectDatesForm(request.POST, timeframes=timeframes)
if form.is_valid():
pass
else:
form = SelectDatesForm(timeframes=timeframes)
我的表单是这样做的:
class SelectDatesForm(forms.Form):
timeframes = forms.ModelChoiceField(queryset=HostTimeFrame.objects.none(), widget=forms.CheckboxSelectMultiple,
empty_label=None)
def __init__(self, *args, **kwargs):
qs = kwargs.pop('timeframes')
super(SelectDatesForm, self).__init__(*args, **kwargs)
self.fields['timeframes'].queryset = qs.order_by('start')
我已经花了好几个小时才找到这个实际验证的位置,并且我找到了它,创建了一个错误here。
答案 0 :(得分:3)
根据文档ModelChoiceField
,其默认小部件为选择 doc
如果要选择多个值,则必须使用ModelMultipleChoiceField,如下所示:
timeframes = forms.ModelMultipleChoiceField(queryset=HostTimeFrame.objects.none(), widget=forms.CheckboxSelectMultiple,empty_label=None)
答案 1 :(得分:0)
这似乎是一个错误,我的解决方法是创建我自己的Choice字段并覆盖to_python()方法:
class CustomModelChoiceField(ModelChoiceField):
def to_python(self, value):
if value in self.empty_values:
return None
try:
key = self.to_field_name or 'pk'
#--------hacky bugfix---------------
if type(value) == list:
value = value[0]
value = self.queryset.get(**{key: value})
except (ValueError, TypeError, self.queryset.model.DoesNotExist):
raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice')
return value