From 21420096c4db78ccb8f549a29d662cff870d363c Mon Sep 17 00:00:00 2001 From: orlnub123 <30984274+orlnub123@users.noreply.github.com> Date: Thu, 22 Mar 2018 16:05:31 +0300 Subject: [PATCH] Fixed #29247 -- Allowed blank model field choice to be defined in nested choices. --- django/db/models/fields/__init__.py | 3 +-- tests/model_fields/tests.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 44052a7bc36..f21a6df7f79 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 fb0098a262c..45f61a00346 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')))])