[Django] #23335: Related fields pointing to custom fields that store different values in the database than the python representation do not remember selections

41 views
Skip to first unread message

Django

unread,
Aug 21, 2014, 3:23:50 PM8/21/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
----------------------------+----------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------+----------------------
I have uploaded a demonstration to github here:
https://github.com/thenewguy/django_custom_primary_key_related_field_incompatibility
Concisely, forms do not preserve related field selections on these custom
fields.

If you have a custom field that returns a custom object from the database
that is different from the value returned from to_python, related fields
that point to forget the current selection when they are rendered by
forms.

I encountered this attempting to use a custom field that maps signed
integers to fixed length string representation of unsigned integers for
use as identifiers.

--
Ticket URL: <https://code.djangoproject.com/ticket/23335>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Aug 27, 2014, 10:01:05 AM8/27/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------
Changes (by timgraham):

* status: new => closed
* needs_better_patch: => 0
* resolution: => needsinfo
* needs_tests: => 0
* needs_docs: => 0


Comment:

I spent some time looking at this, but ultimately, I couldn't determine
whether this was a bug in Django or in your own code. It would be helpful
if you could provide more details about where you think the problem lies.

By the way, there are [https://github.com/django/django/pull/3047 plans to
deprecate] `SubFieldBase`. Your issue may still be valid, but I thought
I'd mention it so you are aware.

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:1>

Django

unread,
Sep 18, 2014, 5:59:16 PM9/18/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------

Comment (by thenewguy):

Sorry for the delayed response. I didn't get a notice of activity for
some reason.

I am not sure exactly where the bug is. This is from memory from awhile
ago, but when the form is rendered the widget is passed the raw value of
the relation (e.g. -200 instead of 1 for the int field in my demo). So
when the choice widget compares the value -200 against possible choice
values, it doesn't match because it is comparing the db value against the
to_python value. The choices iterable that the widget checks for the
value -200 in contains the to_python value that -200 was mapped to (i.e.
1).

I do not think the bug is in my code. It seems to work for everything
except for this issue with forms.

Have I explained the problem well enough for you to reproduce/observe the
symptoms?

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:2>

Django

unread,
Sep 18, 2014, 6:00:15 PM9/18/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------

Reporter: thenewguy | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.7-rc-2
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
---------------------------+--------------------------------------
Changes (by thenewguy):

* status: closed => new
* resolution: needsinfo =>


--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:3>

Django

unread,
Oct 1, 2014, 9:27:23 AM10/1/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------
Changes (by timgraham):

* status: new => closed

* resolution: => needsinfo


Comment:

I think we really need more effort on your part in suggesting a solution
since the example is quite complex and very specialized. Once again, I
spent over an hour looking at this and couldn't figure out the exact
issue.

Something suspicious that seems related to the problem:
{{{
>>> a = BarInt.objects.get()
>>> a.pk
-15
>>> # a.pk is a shortcut for a.id_id
>>> a.id_id
-15
>>> a.id
<FooInt: 185>

>>> # how form data is generated
>>> model_to_dict(a)
{'id': -15}

>>> # how form choices are generated
>>> [str(a) for a in FooInt.objects.all()]
['185']
}}}

I could make the Id and Fk widgets work by adding this method to the
model:
{{{
def serializable_value(self, field_name):
val = super(FooInt, self).serializable_value(field_name)
if field_name == 'id':
return val.db_value
return val
}}}
but this may not be a good solution and I'm not sure if this will cause
other problems (also m2m didn't work).

Also it would be helpful to modify your project so that it doesn't use
`SubFieldBase` to verify the issue still exists without that (I suspect it
does).

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:4>

Django

unread,
Oct 1, 2014, 2:17:21 PM10/1/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------

Comment (by thenewguy):

Hello Tim. I am happy to spend more time on this. I am covered up for a
few weeks with deadlines. Can we reopen this issue?

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:5>

Django

unread,
Oct 1, 2014, 3:03:04 PM10/1/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------

Comment (by timgraham):

Yes, please reopen when you provide more details showing what the bug is
then I'll be happy to take another look.

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:6>

Django

unread,
Oct 2, 2014, 12:21:27 PM10/2/14
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------

Comment (by timgraham):

This may be a duplicate or at least related to #17122.

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:7>

Django

unread,
Sep 25, 2015, 12:44:27 PM9/25/15
to django-...@googlegroups.com
#23335: Related fields pointing to custom fields that store different values in the
database than the python representation do not remember selections
---------------------------+--------------------------------------
Reporter: thenewguy | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.7-rc-2
Severity: Normal | Resolution: fixed
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------+--------------------------------------
Changes (by thenewguy):

* resolution: needsinfo => fixed


Comment:

So this has been fixed in DJ18 with the from_db_value() method. I was
never able to get something working under DJ17. I've been able to make
this work with DJ18, DJ19 and master.

--
Ticket URL: <https://code.djangoproject.com/ticket/23335#comment:8>

Reply all
Reply to author
Forward
0 new messages