2016-12-06 1 views
0

をModelChoiceField選択:ここで私はエラーを取得)(イムform.is_valid実行するたびに、有効な選択肢は

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

この実際の検証がどこで実行されているかを調べてみたところ、バグが見つかりました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 
関連する問題