2016-12-06 66 views
0

每当运行form.is_valid IM()我得到的错误:选择一个有效的选择ModelChoiceField

Select a valid choice. That choice is not one of the available choices.

这是我做我的观点:

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') 

我一直在尝试几个小时才能找到这个实际的验证完成,我发现它,创建了一个bug here

回答

3

根据文档ModelChoiceField其默认控件是选择doc

如果你想选择多个值,你必须使用ModelMultipleChoiceField像这样:

timeframes = forms.ModelMultipleChoiceField(queryset=HostTimeFrame.objects.none(), widget=forms.CheckboxSelectMultiple,empty_label=None) 
+0

哇...这个错误信息应该更清楚,然后工作,谢谢! – Julian

0

这似乎是一个错误,我的解决办法是创造我自己选择的领域和覆盖的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 
相关问题