#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.

Reply via email to