Opened 11 years ago
Closed 9 years ago
#23128 closed Bug (worksforme)
_get_FIELD_display doesn't work with Field.get_choices using Iterators — at Version 5
| 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 )
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 , 11 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 11 years ago
comment:3 by , 11 years ago
| Cc: | added |
|---|
comment:4 by , 10 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:5 by , 9 years ago
| Description: | modified (diff) |
|---|---|
| Resolution: | → worksforme |
| Status: | assigned → closed |
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.
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>