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