Fixed #15127 -- Properly copy the choices of choice fields. Thanks, dready and Julian Phalip.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16416 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2011-06-16 16:34:38 +00:00
parent aa40dc6252
commit 22529d41b2
2 changed files with 26 additions and 1 deletions

View File

@ -657,6 +657,11 @@ class ChoiceField(Field):
initial=initial, help_text=help_text, *args, **kwargs) initial=initial, help_text=help_text, *args, **kwargs)
self.choices = choices self.choices = choices
def __deepcopy__(self, memo):
result = super(ChoiceField, self).__deepcopy__(memo)
result._choices = copy.deepcopy(self._choices, memo)
return result
def _get_choices(self): def _get_choices(self):
return self._choices return self._choices

View File

@ -771,6 +771,26 @@ class FormsTestCase(TestCase):
f = Person(name_max_length=None) f = Person(name_max_length=None)
self.assertEqual(f['first_name'].field.max_length, f['last_name'].field.max_length, (30, 30)) self.assertEqual(f['first_name'].field.max_length, f['last_name'].field.max_length, (30, 30))
# Similarly, choices do not persist from one Form instance to the next.
# Refs #15127.
class Person(Form):
first_name = CharField(required=False)
last_name = CharField(required=False)
gender = ChoiceField(choices=(('f', 'Female'), ('m', 'Male')))
def __init__(self, allow_unspec_gender=False, *args, **kwargs):
super(Person, self).__init__(*args, **kwargs)
if allow_unspec_gender:
self.fields['gender'].choices += (('u', 'Unspecified'),)
f = Person()
self.assertEqual(f['gender'].field.choices, [('f', 'Female'), ('m', 'Male')])
f = Person(allow_unspec_gender=True)
self.assertEqual(f['gender'].field.choices, [('f', 'Female'), ('m', 'Male'), ('u', 'Unspecified')])
f = Person()
self.assertEqual(f['gender'].field.choices, [('f', 'Female'), ('m', 'Male')])
def test_hidden_widget(self): def test_hidden_widget(self):
# HiddenInput widgets are displayed differently in the as_table(), as_ul()) # HiddenInput widgets are displayed differently in the as_table(), as_ul())
# and as_p() output of a Form -- their verbose names are not displayed, and a # and as_p() output of a Form -- their verbose names are not displayed, and a
@ -1154,7 +1174,7 @@ class FormsTestCase(TestCase):
def test_boundfield_values(self): def test_boundfield_values(self):
# It's possible to get to the value which would be used for rendering # It's possible to get to the value which would be used for rendering
# the widget for a field by using the BoundField's value method. # the widget for a field by using the BoundField's value method.
class UserRegistration(Form): class UserRegistration(Form):
username = CharField(max_length=10, initial='djangonaut') username = CharField(max_length=10, initial='djangonaut')
password = CharField(widget=PasswordInput) password = CharField(widget=PasswordInput)