#25980: Wrong handling of initial value on disabled ModelMultipleChoiceField
-------------------------------+--------------------------------------
Reporter: karyon | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | 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 karyon:
Old description:
> So i provided a queryset as initial value for a non-required and disabled
> ModelMultipleChoiceField. it seemed to work as i saw the correct values
> in the rendered output.
>
> but, when saving the form i got an error {{{ Enter a list of values.}}}
>
> 1. the error did not show up when the queryset i provided yielded no
> results, which is inconsistent. the reason for that is that
> [https://github.com/django/django/blob/d91cc25a2a43cb2526943dc2285ffe59e38fabfd/django/forms/models.py#L1250
> this boolean expression] evaluates to true as soon as there are results
> in the queryset.
>
> edit: just found out this can only happen for disabled fields, because
> there the initial value is cleaned, and not some value taken from the
> widget, see
> [https://github.com/django/django/blob/d91cc25a2a43cb2526943dc2285ffe59e38fabfd/django/forms/forms.py#L372
> here]
>
> 2. something else appeared fishy to me: in one line this method returns a
> queryset ({{{self.queryset.none()}}}), but in the next line it raises an
> error if the value is neither a list nor a tuple.
>
> if you folks tell me what the intended behaviour is / which types should
> be used, i can try to create a fix if you want.
>
> 3. and the last (slightly unrelated) issue: since the field was disabled,
> i was wondering why cleaning it doesn't take a shortcut and does nothing
> at all... bumped into this a few times.
New description:
So i provided a queryset as initial value for a non-required and disabled
ModelMultipleChoiceField. it seemed to work as i saw the correct values in
the rendered output.
but, when saving the form i got an error {{{ Enter a list of values.}}}
1. this happens because disabled fields send their initial value to
cleaning, see
[[https://github.com/django/django/blob/d91cc25a2a43cb2526943dc2285ffe59e38fabfd/django/forms/forms.py#L372
here]. in case of model fields, it looks like this must be a list of PKs,
which is quite unhandy to build (something like
{{{list(queryset.values_list('pk', flat=True))}}})
2. the error did not show up when the queryset i provided yielded no
results, which is inconsistent. the reason for that is that
[https://github.com/django/django/blob/d91cc25a2a43cb2526943dc2285ffe59e38fabfd/django/forms/models.py#L1250
this boolean expression] evaluates to true as soon as there are results in
the queryset.
3. something else appeared fishy to me: in one line the clean method
returns a queryset ({{{self.queryset.none()}}}), but in the next line it
raises an error if the value is neither a list nor a tuple.
if you folks tell me what the intended behaviour is / which types should
be used, i can try to create a fix if you want.
4. and the last (slightly unrelated) issue: since the field was disabled,
i was wondering why cleaning it doesn't take a shortcut and does nothing
at all... bumped into this a few times.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/25980#comment:3>
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/064.3b055fe1b3e34f1491c0693b5e255fb6%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.