#35640: ModelMultipleChoiceField fail when the foreignkey remote model is a 
child
class of anohter model
-------------------------------+--------------------------------------
     Reporter:  Omar BENHAMID  |                    Owner:  (none)
         Type:  Bug            |                   Status:  new
    Component:  Forms          |                  Version:  3.2
     Severity:  Normal         |               Resolution:
     Keywords:                 |             Triage Stage:  Unreviewed
    Has patch:  1              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  0              |                    UI/UX:  0
-------------------------------+--------------------------------------
Changes (by Omar BENHAMID):

 * version:  5.1 => 3.2


Old description:

> == The issue
>
> When a child model is used as a foreign key, forms with
> ModelMultipleChoiceField (not setting to_field_name) will systematically
> fail to validate submited values.
>

> == Reproduction
>
> models.py
> {{{
> class A(models.Model):
>       pass
>
> class B(A):
>       pass
>
> class C(models.Model):
>       fkfield = models.ForeignKey(B, on_delete=models.CASCADE)
> }}}
>
> Create form with MultipleChoiceField of the foreignkey fkfield and it
> will systematically fail to validate.
>
> == Reason
>
> ModelMultipleChoiceField  uses value.pk in prepare_value to generate
> choices but uses "to_field_name" in _check_data for validation.
> default to_field_name is by default related_field.field_name which is
> "<parent>_ptr" in the case of inheriance child models, which points to
> the parent itself (not the pk).
>
> ModelMultipleChoiceField fail when the foreignkey remote model is a child
> class of anohter model
> == Workaround
>
> Use to_field_name = 'pk' when ModelMultipleChoiceField  is created.
>
> == Proposed fix
>
> Use PK in validation like in generation of choices.
>
> Spotted in 3.2, still exist in latest HEAD, probably existed before ...

New description:

 == The issue

 When a child model is used as a foreign key, forms with
 ModelMultipleChoiceField (not setting to_field_name) will systematically
 fail to validate submited values.


 == Reproduction

 models.py
 {{{
 class A(models.Model):
       pass

 class B(A):
       pass

 class C(models.Model):
       fkfield = models.ForeignKey(B, on_delete=models.CASCADE)
 }}}

 Create form with MultipleChoiceField of the foreignkey fkfield and it will
 systematically fail to validate.

 == Reason

 ModelMultipleChoiceField  uses value.pk in prepare_value to generate
 choices but uses "to_field_name" in _check_data for validation.
 default to_field_name is by default related_field.field_name which is
 "<parent>_ptr" in the case of inheriance child models, which points to the
 parent itself (not the pk).

 ModelMultipleChoiceField fail when the foreignkey remote model is a child
 class of anohter model
 == Workaround

 Use to_field_name = 'pk' when ModelMultipleChoiceField  is created.

 == Proposed fix

 Use PK in validation like in generation of choices.

 Spotted in 3.2

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35640#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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107019102529489-32b50b7b-f262-4e27-911e-d8ce86c66e72-000000%40eu-central-1.amazonses.com.

Reply via email to