Commit 48cd8e85 authored by Luke Plant's avatar Luke Plant
Browse files

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
parent 960af902
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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

+14 −1
Original line number Diff line number Diff line
@@ -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)