#27578: ModelChoiceField.to_python() somehow receives value as type 'list' ----------------------------------+-------------------------------------- Reporter: Julian Schneider | Owner: nobody Type: Bug | Status: new Component: Forms | Version: 1.9 Severity: Normal | Resolution: Keywords: | Triage Stage: Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 ----------------------------------+-------------------------------------- Description changed by Julian Schneider:
Old description: > Whenever im running form.is_valid() i get the error: > > > Select a valid choice. That choice is not one of the available > > choices. > > Here is what I do in my view: > > {{{ > > timeframes = HostTimeFrame.objects.all() > if request.method == 'POST': > form = SelectDatesForm(request.POST, timeframes=timeframes) > if form.is_valid(): > pass > else: > form = SelectDatesForm(timeframes=timeframes) > > }}} > > My form does this: > > {{{ > 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') > }}} > > Ive been trying for hours to find where this actual validation is done, > and realized the exception is raised in ModelChoiceField.to_python() > > {{{ > try: > key = self.to_field_name or 'pk' > value = self.queryset.get(**{key: value}) > except (ValueError, TypeError, self.queryset.model.DoesNotExist): > raise ValidationError(self.error_messages['invalid_choice'], > code='invalid_choice') > }}} > > Where value is the primary key, ** but in List format**, this raises and > exception. New description: Whenever im running form.is_valid() i get the error: > Select a valid choice. That choice is not one of the available > choices. Here is what I do in my view: {{{ timeframes = HostTimeFrame.objects.all() if request.method == 'POST': form = SelectDatesForm(request.POST, timeframes=timeframes) if form.is_valid(): pass else: form = SelectDatesForm(timeframes=timeframes) }}} My form does this: {{{ 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') }}} Ive been trying for hours to find where this actual validation is done, and realized the exception is raised in ModelChoiceField.to_python() {{{ try: key = self.to_field_name or 'pk' value = self.queryset.get(**{key: value}) except (ValueError, TypeError, self.queryset.model.DoesNotExist): raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice') }}} Where value is the primary key, ** but in List format**, this raises an exception. -- -- Ticket URL: <https://code.djangoproject.com/ticket/27578#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/073.670cf8057d2a42159a1088e97383f3ac%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.