diff --git a/django/forms/boundfield.py b/django/forms/boundfield.py index a1063b2b05..a8e81afe9b 100644 --- a/django/forms/boundfield.py +++ b/django/forms/boundfield.py @@ -57,6 +57,13 @@ class BoundField(object): for widget in self.field.widget.subwidgets(self.html_name, self.value(), attrs=attrs) ) + def __bool__(self): + # BoundField evaluates to True even if it doesn't have subwidgets. + return True + + def __nonzero__(self): # Python 2 compatibility + return type(self).__bool__(self) + def __iter__(self): return iter(self.subwidgets) diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt index e7f2638881..953a6e8889 100644 --- a/docs/releases/1.11.1.txt +++ b/docs/releases/1.11.1.txt @@ -24,3 +24,6 @@ Bugfixes * Fixed empty POST data table appearing instead of "No POST data" in HTML debug page (:ticket:`28079`). + +* Restored ``BoundField``\s without any ``choices`` evaluating to ``True`` + (:ticket:`28058`). diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index 2b93575bf2..ffad6f60a6 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -745,6 +745,13 @@ Java [str(bf[1]), str(bf[2]), str(bf[3])], ) + def test_boundfield_bool(self): + """BoundField without any choices (subwidgets) evaluates to True.""" + class TestForm(Form): + name = ChoiceField(choices=[]) + + self.assertIs(bool(TestForm()['name']), True) + def test_forms_with_multiple_choice(self): # MultipleChoiceField is a special case, as its data is required to be a list: class SongForm(Form):