summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Plant <L.Plant.98@cantab.net>2010-03-08 23:55:04 +0000
committerLuke Plant <L.Plant.98@cantab.net>2010-03-08 23:55:04 +0000
commit48cd8e856fa027e0e699e5a5ed7e3eb8f8450abb (patch)
tree41b315b426735f7220c5a8edab7e36c10be9b9ef
parent960af90279081e7a4121736f3f2bc67077f11b31 (diff)
Fixed #11183 - BaseForm init leaves pointers pointing back to base_fields
Thanks to margieroginski for the report git-svn-id: http://code.djangoproject.com/svn/django/trunk@12733 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/forms/models.py6
-rw-r--r--tests/regressiontests/model_forms_regress/tests.py15
2 files changed, 20 insertions, 1 deletions
diff --git a/django/forms/models.py b/django/forms/models.py
index acfbe490d5..45a2e0cd16 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -923,6 +923,12 @@ class ModelChoiceField(ChoiceField):
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
diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py
index 3d3a103a58..5a7a83bc0e 100644
--- a/tests/regressiontests/model_forms_regress/tests.py
+++ b/tests/regressiontests/model_forms_regress/tests.py
@@ -2,7 +2,7 @@ from datetime import date
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
@@ -203,3 +203,16 @@ class OneToOneFieldTests(TestCase):
form = AuthorForm({'publication':u'', 'full_name':'John Doe'}, instance=author)
self.assert_(not form.is_valid())
+
+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)