diff options
| author | Peter Andersen <peter@porksmash.com> | 2019-12-09 08:54:40 -0800 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-12-11 09:43:36 +0100 |
| commit | e8fdf00cc2acdcc992fd9621230e927594dc5d4f (patch) | |
| tree | b908dfa94abba8365e08c241af4a22a5e618cbfc | |
| parent | 4f1501660b869c8358ce32b71464d8016c15208c (diff) | |
[1.11.x] Fixed #31073 -- Prevented CheckboxInput.get_context() from mutating attrs.
Backport of 02eff7ef60466da108b1a33f1e4dc01eec45c99d from master.
| -rw-r--r-- | django/forms/widgets.py | 2 | ||||
| -rw-r--r-- | tests/forms_tests/widget_tests/test_checkboxinput.py | 5 | ||||
| -rw-r--r-- | tests/postgres_tests/test_array.py | 11 |
3 files changed, 18 insertions, 0 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 2b7e07bea3..5e82c06213 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -508,6 +508,8 @@ class CheckboxInput(Input): if self.check_test(value): if attrs is None: attrs = {} + else: + attrs = attrs.copy() attrs['checked'] = True return super(CheckboxInput, self).get_context(name, value, attrs) diff --git a/tests/forms_tests/widget_tests/test_checkboxinput.py b/tests/forms_tests/widget_tests/test_checkboxinput.py index 1ae6ab73b6..37bb2df552 100644 --- a/tests/forms_tests/widget_tests/test_checkboxinput.py +++ b/tests/forms_tests/widget_tests/test_checkboxinput.py @@ -89,3 +89,8 @@ class CheckboxInputTest(WidgetTest): def test_value_omitted_from_data(self): self.assertIs(self.widget.value_omitted_from_data({'field': 'value'}, {}, 'field'), False) self.assertIs(self.widget.value_omitted_from_data({}, {}, 'field'), False) + + def test_get_context_does_not_mutate_attrs(self): + attrs = {'checked': False} + self.widget.get_context('name', True, attrs) + self.assertIs(attrs['checked'], False) diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index a66c92a016..0b706e85ad 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -826,6 +826,17 @@ class TestSplitFormWidget(PostgreSQLWidgetTestCase): } ) + def test_checkbox_get_context_attrs(self): + context = SplitArrayWidget( + forms.CheckboxInput(), + size=2, + ).get_context('name', [True, False]) + self.assertEqual(context['widget']['value'], '[True, False]') + self.assertEqual( + [subwidget['attrs'] for subwidget in context['widget']['subwidgets']], + [{'checked': True}, {}] + ) + def test_render(self): self.check_html( SplitArrayWidget(forms.TextInput(), size=2), 'array', None, |
