diff options
| author | Francesco Panico <panico.francesco@gmail.com> | 2022-11-17 22:45:06 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-11-18 08:06:13 +0100 |
| commit | 51faf4bd172cd4cb219a9793facbfa00246c9f3c (patch) | |
| tree | 8dd28c9fee31b34267ff0b7d25853fba2280e3f8 | |
| parent | fbde929b19754f19cba1d14e86f4c59f4b0a633c (diff) | |
Fixed #34148 -- Reverted "Fixed #32901 -- Optimized BaseForm.__getitem__()."
This reverts commit edde2a069929c93e37835dc3f7c9a229040058e2.
Thanks Jan Pieter Waagmeester for the report.
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/forms/forms.py | 10 | ||||
| -rw-r--r-- | tests/forms_tests/tests/test_forms.py | 16 |
3 files changed, 20 insertions, 7 deletions
@@ -330,6 +330,7 @@ answer newbie questions, and generally made Django that much better: Florian Demmer <fdemmer@gmail.com> Florian Moussous <florian.moussous@gmail.com> Fran Hrženjak <fran.hrzenjak@gmail.com> + Francesco Panico <panico.francesco@gmail.com> Francisco Albarran Cristobal <pahko.xd@gmail.com> Francisco Couzo <franciscouzo@gmail.com> François Freitag <mail@franek.fr> diff --git a/django/forms/forms.py b/django/forms/forms.py index 7c9f1034d2..6884e6e724 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -175,10 +175,6 @@ class BaseForm(RenderableFormMixin): def __getitem__(self, name): """Return a BoundField with the given name.""" try: - return self._bound_fields_cache[name] - except KeyError: - pass - try: field = self.fields[name] except KeyError: raise KeyError( @@ -189,9 +185,9 @@ class BaseForm(RenderableFormMixin): ", ".join(sorted(self.fields)), ) ) - bound_field = field.get_bound_field(self, name) - self._bound_fields_cache[name] = bound_field - return bound_field + if name not in self._bound_fields_cache: + self._bound_fields_cache[name] = field.get_bound_field(self, name) + return self._bound_fields_cache[name] @property def errors(self): diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index 6005472194..930a200b14 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -4579,6 +4579,22 @@ Options: <select multiple name="options" required> '<legend number="9999" for="id_first_name">First name:</legend>', ) + def test_remove_cached_field(self): + class TestForm(Form): + name = CharField(max_length=10) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Populate fields cache. + [field for field in self] + # Removed cached field. + del self.fields["name"] + + f = TestForm({"name": "abcde"}) + + with self.assertRaises(KeyError): + f["name"] + @jinja2_tests class Jinja2FormsTestCase(FormsTestCase): |
