diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 44052a7bc3..f21a6df7f7 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -816,8 +816,7 @@ class Field(RegisterLookupMixin): if self.choices: choices = list(self.choices) if include_blank: - named_groups = isinstance(choices[0][1], (list, tuple)) - blank_defined = not named_groups and any(choice in ('', None) for choice, __ in choices) + blank_defined = any(choice in ('', None) for choice, _ in self.flatchoices) if not blank_defined: choices = blank_choice + choices return choices diff --git a/tests/model_fields/tests.py b/tests/model_fields/tests.py index fb0098a262..45f61a0034 100644 --- a/tests/model_fields/tests.py +++ b/tests/model_fields/tests.py @@ -140,6 +140,19 @@ class GetChoicesTests(SimpleTestCase): f = models.CharField(choices=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): lazy_func = lazy(lambda x: 0 / 0, int) # raises ZeroDivisionError if evaluated. f = models.CharField(choices=[(lazy_func('group'), (('a', 'A'), ('b', 'B')))])