Refs #27563 -- Fixed ModelChoiceField.__deepcopy__() so forms don't share a queryset cache.

Thanks Luke Benstead for the report Simon Charettes for the fix.
This commit is contained in:
Tim Graham 2017-03-15 12:54:26 -04:00 committed by GitHub
parent 0d83052e52
commit 44f9241c48
2 changed files with 10 additions and 1 deletions

View File

@ -1155,7 +1155,7 @@ class ModelChoiceField(ChoiceField):
def __deepcopy__(self, memo): def __deepcopy__(self, memo):
result = super(ChoiceField, self).__deepcopy__(memo) result = super(ChoiceField, self).__deepcopy__(memo)
# Need to force a new ModelChoiceIterator to be created, bug #11183 # Need to force a new ModelChoiceIterator to be created, bug #11183
result.queryset = result.queryset result.queryset = self.queryset.all()
return result return result
def _get_queryset(self): def _get_queryset(self):

View File

@ -1631,6 +1631,15 @@ class ModelChoiceFieldTests(TestCase):
self.assertIsNot(field1, ModelChoiceForm.base_fields['category']) self.assertIsNot(field1, ModelChoiceForm.base_fields['category'])
self.assertIs(field1.widget.choices.field, field1) 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): def test_modelchoicefield_22745(self):
""" """
#22745 -- Make sure that ModelChoiceField with RadioSelect widget #22745 -- Make sure that ModelChoiceField with RadioSelect widget