Opened 10 years ago

Closed 8 years ago

#23128 closed Bug (worksforme)

_get_FIELD_display doesn't work with Field.get_choices using Iterators

Reported by: Areski Belaid Owned by: Sergii Lapin
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords: get_choices
Cc: cmawebsite@… Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Tim Graham)

Context:
This issue has been noted when fixing https://code.djangoproject.com/ticket/23112

Current behavior:
Using _get_FIELD_display on a Field.choices using Iterators, you will get the first tuple value.

Expected behavior:
Expected result is to get the human-readable name in from the iterator tuple.

Tests to reproduce the issue:

Edit tests/model_fields/tests.py add inside class ChoicesTests(test.TestCase) the following tests:

def test_iterator_choices_and_field_display(self):
    """
    Check that get_choices works with Iterators (#23112).
    """
    self.assertEqual(WhizIter(c=1).get_c_display(), 'val-1') # A nested value
    self.assertEqual(WhizIter(c=9).get_c_display(), 9) # Invalid value
    self.assertEqual(WhizIter(c=None).get_c_display(), None) # Blank value
    self.assertEqual(WhizIter(c='').get_c_display(), '') # Empty value

Change History (5)

comment:1 by Simon Charette, 10 years ago

Triage Stage: UnreviewedAccepted

comment:2 by Collin Anderson, 10 years ago

that's odd. it works for me.

In [2]: Address(country='CA').get_country_display()
Out[2]: u'Canada'

In [3]: Address(country='US').get_country_display()
Out[3]: u'United States'

In [4]: import django; django.get_version()
Out[4]: '1.8.dev20140805124457'

In [5]: Address._meta.get_field('country').choices
Out[5]: <itertools.tee at 0x2d978c0>

comment:3 by Collin Anderson, 10 years ago

Cc: cmawebsite@… added

comment:4 by Sergii Lapin, 8 years ago

Owner: changed from nobody to Sergii Lapin
Status: newassigned

comment:5 by Tim Graham, 8 years ago

Description: modified (diff)
Resolution: worksforme
Status: assignedclosed

I don't think there's an issue here. The Counter used for the choices in WhizIter generates values starting from two, not one so the provided test isn't correct. If you change the first line to self.assertEqual(WhizIter(c=2).get_c_display(), 'val-2') it passes.

Note: See TracTickets for help on using tickets.
Back to Top