From a95616944b9cb58c2547d1f08590b3ad3a142fe2 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Wed, 15 Mar 2017 12:54:26 -0400 Subject: [PATCH] [1.11.x] Refs #27563 -- Fixed ModelChoiceField.__deepcopy__() so forms don't share a queryset cache. Thanks Luke Benstead for the report Simon Charettes for the fix. Backport of 44f9241c48e28823b140bc4ec7515f5a88b88c32 from master --- django/forms/models.py | 2 +- tests/model_forms/tests.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/django/forms/models.py b/django/forms/models.py index a0f3ff53b3..de0ab6c28d 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -1165,7 +1165,7 @@ class ModelChoiceField(ChoiceField): def __deepcopy__(self, memo): result = super(ChoiceField, self).__deepcopy__(memo) # Need to force a new ModelChoiceIterator to be created, bug #11183 - result.queryset = result.queryset + result.queryset = self.queryset.all() return result def _get_queryset(self): diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 8b293a02ad..49ed9f03dd 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -1637,6 +1637,15 @@ class ModelChoiceFieldTests(TestCase): self.assertIsNot(field1, ModelChoiceForm.base_fields['category']) self.assertIs(field1.widget.choices.field, field1) + def test_modelchoicefield_result_cache_not_shared(self): + class ModelChoiceForm(forms.Form): + category = forms.ModelChoiceField(Category.objects.all()) + + form1 = ModelChoiceForm() + self.assertCountEqual(form1.fields['category'].queryset, [self.c1, self.c2, self.c3]) + form2 = ModelChoiceForm() + self.assertIsNone(form2.fields['category'].queryset._result_cache) + def test_modelchoicefield_22745(self): """ #22745 -- Make sure that ModelChoiceField with RadioSelect widget