Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.1.X] Fixed #11183 - BaseForm init leaves pointers pointing back to…

… base_fields

  
Thanks to margieroginski for the report

Backport of [12733] from trunk


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12736 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 89c263932378fa4b370ab28ef7658472f31643e0 1 parent f13b17a
@spookylukey spookylukey authored
View
6 django/forms/models.py
@@ -952,6 +952,12 @@ def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
self.choice_cache = None
self.to_field_name = to_field_name
+ 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
+ return result
+
def _get_queryset(self):
return self._queryset
View
16 tests/regressiontests/model_forms_regress/tests.py
@@ -2,7 +2,7 @@
from django import db
from django import forms
-from django.forms.models import modelform_factory
+from django.forms.models import modelform_factory, ModelChoiceField
from django.conf import settings
from django.test import TestCase
@@ -107,3 +107,17 @@ def test_no_model_class(self):
class NoModelModelForm(forms.ModelForm):
pass
self.assertRaises(ValueError, NoModelModelForm)
+
+
+class ModelChoiceForm(forms.Form):
+ person = ModelChoiceField(Person.objects.all())
+
+
+class TestTicket11183(TestCase):
+ def test_11183(self):
+ form1 = ModelChoiceForm()
+ field1 = form1.fields['person']
+ # To allow the widget to change the queryset of field1.widget.choices correctly,
+ # without affecting other forms, the following must hold:
+ self.assert_(field1 is not ModelChoiceForm.base_fields['person'])
+ self.assert_(field1.widget.choices.field is field1)
Please sign in to comment.
Something went wrong with that request. Please try again.