Skip to content

Commit

Permalink
Fixed #3489 -- Added proper deepcopying to form fields so that widget…
Browse files Browse the repository at this point in the history
… instances get copied as well. Patch from Jonathan Buchanan and insin.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6156 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Sep 14, 2007
1 parent 813c48e commit 70e5dce
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
7 changes: 7 additions & 0 deletions django/newforms/fields.py
Expand Up @@ -2,6 +2,7 @@
Field classes Field classes
""" """


import copy
import datetime import datetime
import re import re
import time import time
Expand Down Expand Up @@ -100,6 +101,12 @@ def widget_attrs(self, widget):
""" """
return {} return {}


def __deepcopy__(self, memo):
result = copy.copy(self)
memo[id(self)] = result
result.widget = copy.deepcopy(self.widget, memo)
return result

class CharField(Field): class CharField(Field):
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
self.max_length, self.min_length = max_length, min_length self.max_length, self.min_length = max_length, min_length
Expand Down
2 changes: 1 addition & 1 deletion django/newforms/forms.py
Expand Up @@ -31,7 +31,7 @@ def __init__(self, data=None):
dict.__init__(self, dict(data)) dict.__init__(self, dict(data))


def copy(self): def copy(self):
return SortedDictFromList([(k, copy.copy(v)) for k, v in self.items()]) return SortedDictFromList([(k, copy.deepcopy(v)) for k, v in self.items()])


class DeclarativeFieldsMetaclass(type): class DeclarativeFieldsMetaclass(type):
""" """
Expand Down
8 changes: 8 additions & 0 deletions tests/regressiontests/forms/tests.py
Expand Up @@ -2690,16 +2690,24 @@
... super(Person, self).__init__(*args, **kwargs) ... super(Person, self).__init__(*args, **kwargs)
... if names_required: ... if names_required:
... self.fields['first_name'].required = True ... self.fields['first_name'].required = True
... self.fields['first_name'].widget.attrs['class'] = 'required'
... self.fields['last_name'].required = True ... self.fields['last_name'].required = True
... self.fields['last_name'].widget.attrs['class'] = 'required'
>>> f = Person(names_required=False) >>> f = Person(names_required=False)
>>> f['first_name'].field.required, f['last_name'].field.required >>> f['first_name'].field.required, f['last_name'].field.required
(False, False) (False, False)
>>> f['first_name'].field.widget.attrs, f['last_name'].field.widget.attrs
({}, {})
>>> f = Person(names_required=True) >>> f = Person(names_required=True)
>>> f['first_name'].field.required, f['last_name'].field.required >>> f['first_name'].field.required, f['last_name'].field.required
(True, True) (True, True)
>>> f['first_name'].field.widget.attrs, f['last_name'].field.widget.attrs
({'class': 'required'}, {'class': 'required'})
>>> f = Person(names_required=False) >>> f = Person(names_required=False)
>>> f['first_name'].field.required, f['last_name'].field.required >>> f['first_name'].field.required, f['last_name'].field.required
(False, False) (False, False)
>>> f['first_name'].field.widget.attrs, f['last_name'].field.widget.attrs
({}, {})
>>> class Person(Form): >>> class Person(Form):
... first_name = CharField(max_length=30) ... first_name = CharField(max_length=30)
... last_name = CharField(max_length=30) ... last_name = CharField(max_length=30)
Expand Down

0 comments on commit 70e5dce

Please sign in to comment.