From 35a08b8541c856a51b2ab718e0a2fe060debfa2a Mon Sep 17 00:00:00 2001
From: Basil Dubyk
Date: Wed, 14 Nov 2018 20:43:34 +0200
Subject: [PATCH] Fixed #17210 -- Made NullBooleanSelect use unknown/true/false
as query data.
---
django/forms/widgets.py | 22 ++++--
docs/releases/2.2.txt | 5 ++
tests/forms_tests/tests/test_forms.py | 72 ++++++++++-------
.../widget_tests/test_nullbooleanselect.py | 77 +++++++++++++++----
4 files changed, 126 insertions(+), 50 deletions(-)
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index e4f8957189..eed1fa5c3b 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -696,27 +696,35 @@ class NullBooleanSelect(Select):
"""
def __init__(self, attrs=None):
choices = (
- ('1', _('Unknown')),
- ('2', _('Yes')),
- ('3', _('No')),
+ ('unknown', _('Unknown')),
+ ('true', _('Yes')),
+ ('false', _('No')),
)
super().__init__(attrs, choices)
def format_value(self, value):
try:
- return {True: '2', False: '3', '2': '2', '3': '3'}[value]
+ return {
+ True: 'true', False: 'false',
+ 'true': 'true', 'false': 'false',
+ # For backwards compatibility with Django < 2.2.
+ '2': 'true', '3': 'false',
+ }[value]
except KeyError:
- return '1'
+ return 'unknown'
def value_from_datadict(self, data, files, name):
value = data.get(name)
return {
- '2': True,
True: True,
'True': True,
- '3': False,
'False': False,
False: False,
+ 'true': True,
+ 'false': False,
+ # For backwards compatibility with Django < 2.2.
+ '2': True,
+ '3': False,
}.get(value)
diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt
index debc60c5f6..a8bd9ab488 100644
--- a/docs/releases/2.2.txt
+++ b/docs/releases/2.2.txt
@@ -380,6 +380,11 @@ Miscellaneous
* Support for ``cx_Oracle`` < 6.0 is removed.
+* In an attempt to provide more semantic query data, ``NullBooleanSelect`` now
+ renders ``
@@ -2774,9 +2792,9 @@ Good luck picking a username that doesn't already exist.
@@ -2792,9 +2810,9 @@ Good luck picking a username that doesn't already exist.
|
|
|
|
diff --git a/tests/forms_tests/widget_tests/test_nullbooleanselect.py b/tests/forms_tests/widget_tests/test_nullbooleanselect.py
index 779a88893f..a732e86da4 100644
--- a/tests/forms_tests/widget_tests/test_nullbooleanselect.py
+++ b/tests/forms_tests/widget_tests/test_nullbooleanselect.py
@@ -11,36 +11,81 @@ class NullBooleanSelectTest(WidgetTest):
def test_render_true(self):
self.check_html(self.widget, 'is_cool', True, html=(
""""""
))
def test_render_false(self):
self.check_html(self.widget, 'is_cool', False, html=(
""""""
))
def test_render_none(self):
self.check_html(self.widget, 'is_cool', None, html=(
""""""
))
- def test_render_value(self):
+ def test_render_value_unknown(self):
+ self.check_html(self.widget, 'is_cool', 'unknown', html=(
+ """"""
+ ))
+
+ def test_render_value_true(self):
+ self.check_html(self.widget, 'is_cool', 'true', html=(
+ """"""
+ ))
+
+ def test_render_value_false(self):
+ self.check_html(self.widget, 'is_cool', 'false', html=(
+ """"""
+ ))
+
+ def test_render_value_1(self):
+ self.check_html(self.widget, 'is_cool', '1', html=(
+ """"""
+ ))
+
+ def test_render_value_2(self):
self.check_html(self.widget, 'is_cool', '2', html=(
""""""
+ ))
+
+ def test_render_value_3(self):
+ self.check_html(self.widget, 'is_cool', '3', html=(
+ """"""
))
@@ -55,9 +100,9 @@ class NullBooleanSelectTest(WidgetTest):
self.check_html(widget, 'id_bool', True, html=(
"""
"""
))