选择一个有效的选项ModelChoiceField

时间:2016-12-06 22:00:16

标签: python django django-models django-forms

每当我运行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

2 个答案:

答案 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