[3.0.x] Fixed #30839 -- Fixed Field.__deepcopy__() so forms don't share error messages.

Backport of a28d1b38e5 from master
This commit is contained in:
Hasan Ramezani 2019-10-08 09:38:28 +02:00 committed by Mariusz Felisiak
parent 282138a7bb
commit 7c70aa8f63
2 changed files with 12 additions and 0 deletions

View File

@ -201,6 +201,7 @@ class Field:
result = copy.copy(self) result = copy.copy(self)
memo[id(self)] = result memo[id(self)] = result
result.widget = copy.deepcopy(self.widget, memo) result.widget = copy.deepcopy(self.widget, memo)
result.error_messages = self.error_messages.copy()
result.validators = self.validators[:] result.validators = self.validators[:]
return result return result

View File

@ -3685,6 +3685,17 @@ Good luck picking a username that doesn&#x27;t already exist.</p>
self.assertIsInstance(p.data, MultiValueDict) self.assertIsInstance(p.data, MultiValueDict)
self.assertIsInstance(p.files, MultiValueDict) self.assertIsInstance(p.files, MultiValueDict)
def test_field_deep_copy_error_messages(self):
class CustomCharField(CharField):
def __init__(self, **kwargs):
kwargs['error_messages'] = {'invalid': 'Form custom error message.'}
super().__init__(**kwargs)
field = CustomCharField()
field_copy = copy.deepcopy(field)
self.assertIsInstance(field_copy, CustomCharField)
self.assertIsNot(field_copy.error_messages, field.error_messages)
class CustomRenderer(DjangoTemplates): class CustomRenderer(DjangoTemplates):
pass pass