Fixed #29247 -- Allowed blank model field choice to be defined in nested choices.

This commit is contained in:
orlnub123 2018-03-22 16:05:31 +03:00 committed by Tim Graham
parent e35004966b
commit 21420096c4
2 changed files with 14 additions and 2 deletions

View File

@ -816,8 +816,7 @@ class Field(RegisterLookupMixin):
if self.choices: if self.choices:
choices = list(self.choices) choices = list(self.choices)
if include_blank: if include_blank:
named_groups = isinstance(choices[0][1], (list, tuple)) blank_defined = any(choice in ('', None) for choice, _ in self.flatchoices)
blank_defined = not named_groups and any(choice in ('', None) for choice, __ in choices)
if not blank_defined: if not blank_defined:
choices = blank_choice + choices choices = blank_choice + choices
return choices return choices

View File

@ -140,6 +140,19 @@ class GetChoicesTests(SimpleTestCase):
f = models.CharField(choices=choices) f = models.CharField(choices=choices)
self.assertEqual(f.get_choices(include_blank=True), choices) self.assertEqual(f.get_choices(include_blank=True), choices)
def test_blank_in_grouped_choices(self):
choices = [
('f', 'Foo'),
('b', 'Bar'),
('Group', (
('', 'No Preference'),
('fg', 'Foo'),
('bg', 'Bar'),
)),
]
f = models.CharField(choices=choices)
self.assertEqual(f.get_choices(include_blank=True), choices)
def test_lazy_strings_not_evaluated(self): def test_lazy_strings_not_evaluated(self):
lazy_func = lazy(lambda x: 0 / 0, int) # raises ZeroDivisionError if evaluated. lazy_func = lazy(lambda x: 0 / 0, int) # raises ZeroDivisionError if evaluated.
f = models.CharField(choices=[(lazy_func('group'), (('a', 'A'), ('b', 'B')))]) f = models.CharField(choices=[(lazy_func('group'), (('a', 'A'), ('b', 'B')))])