Fixed #23098 -- Checked that lazy choices are not evaluated too soon
Thanks Matthieu Agopian for the report.
This commit is contained in:
parent
2ab0ed7b28
commit
2f73b527dd
|
@ -730,10 +730,12 @@ class Field(RegisterLookupMixin):
|
||||||
"""Returns choices with a default blank choices included, for use
|
"""Returns choices with a default blank choices included, for use
|
||||||
as SelectField choices for this field."""
|
as SelectField choices for this field."""
|
||||||
blank_defined = False
|
blank_defined = False
|
||||||
for choice, __ in self.choices:
|
named_groups = self.choices and isinstance(self.choices[0][1], (list, tuple))
|
||||||
if choice in ('', None):
|
if not named_groups:
|
||||||
blank_defined = True
|
for choice, __ in self.choices:
|
||||||
break
|
if choice in ('', None):
|
||||||
|
blank_defined = True
|
||||||
|
break
|
||||||
|
|
||||||
first_choice = (blank_choice if include_blank and
|
first_choice = (blank_choice if include_blank and
|
||||||
not blank_defined else [])
|
not blank_defined else [])
|
||||||
|
|
|
@ -416,6 +416,13 @@ class ValidationTest(test.TestCase):
|
||||||
f = models.CharField(choices=[('', '<><>'), ('a', 'A')])
|
f = models.CharField(choices=[('', '<><>'), ('a', 'A')])
|
||||||
self.assertEqual(f.get_choices(True), [('', '<><>'), ('a', 'A')])
|
self.assertEqual(f.get_choices(True), [('', '<><>'), ('a', 'A')])
|
||||||
|
|
||||||
|
def test_charfield_get_choices_doesnt_evaluate_lazy_strings(self):
|
||||||
|
# Regression test for #23098
|
||||||
|
# Will raise ZeroDivisionError if lazy is evaluated
|
||||||
|
lazy_func = lazy(lambda x: 0/0, int)
|
||||||
|
f = models.CharField(choices=[(lazy_func('group'), (('a', 'A'), ('b', 'B')))])
|
||||||
|
self.assertEqual(f.get_choices(True)[0], ('', '---------'))
|
||||||
|
|
||||||
def test_choices_validation_supports_named_groups(self):
|
def test_choices_validation_supports_named_groups(self):
|
||||||
f = models.IntegerField(
|
f = models.IntegerField(
|
||||||
choices=(('group', ((10, 'A'), (20, 'B'))), (30, 'C')))
|
choices=(('group', ((10, 'A'), (20, 'B'))), (30, 'C')))
|
||||||
|
|
Loading…
Reference in New Issue