From 216bb2e8fbc3cb37615bbd70edaa73287acdca81 Mon Sep 17 00:00:00 2001 From: James Beith Date: Wed, 22 Mar 2017 16:38:16 +1100 Subject: [PATCH] Fixed #27975 -- Fixed crash if ModelChoiceField's queryset=None. Regression in 9153d8fbd6385db9f48793662de789fc3d686841. --- django/forms/models.py | 3 ++- tests/model_forms/tests.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/django/forms/models.py b/django/forms/models.py index c8626f57b27..b259a8df288 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -1155,7 +1155,8 @@ 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 = self.queryset.all() + if self.queryset is not None: + 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 aa93038eea0..35091468561 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -1640,6 +1640,17 @@ class ModelChoiceFieldTests(TestCase): form2 = ModelChoiceForm() self.assertIsNone(form2.fields['category'].queryset._result_cache) + def test_modelchoicefield_queryset_none(self): + class ModelChoiceForm(forms.Form): + category = forms.ModelChoiceField(queryset=None) + + def __init__(self, *args, **kwargs): + super(ModelChoiceForm, self).__init__(*args, **kwargs) + self.fields['category'].queryset = Category.objects.filter(slug__contains='test') + + form = ModelChoiceForm() + self.assertCountEqual(form.fields['category'].queryset, [self.c2, self.c3]) + def test_modelchoicefield_22745(self): """ #22745 -- Make sure that ModelChoiceField with RadioSelect widget