aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/fields.py
diff options
context:
space:
mode:
authorTom Christie2014-11-05 10:48:30 +0000
committerTom Christie2014-11-05 10:48:30 +0000
commit0a5d088287be1bb56f37504cc75cee10fb4e74a0 (patch)
treebd7a05cb9496d4a374fa4d6186c631a752c5c82b /rest_framework/fields.py
parent26b6180f5047e965383553177cd5cd7938bbe63e (diff)
downloaddjango-rest-framework-0a5d088287be1bb56f37504cc75cee10fb4e74a0.tar.bz2
Fix failing copy of fields when RegexValidator is used. Closes #1954.
Diffstat (limited to 'rest_framework/fields.py')
-rw-r--r--rest_framework/fields.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 24ddb7a4..363b684f 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -1,7 +1,7 @@
from django.conf import settings
-from django.core import validators
from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ValidationError as DjangoValidationError
+from django.core.validators import RegexValidator
from django.forms import ImageField as DjangoImageField
from django.utils import six, timezone
from django.utils.datastructures import SortedDict
@@ -392,7 +392,15 @@ class Field(object):
originally created with, rather than copying the complete state.
"""
args = copy.deepcopy(self._args)
- kwargs = copy.deepcopy(self._kwargs)
+ kwargs = dict(self._kwargs)
+ # Bit ugly, but we need to special case 'validators' as Django's
+ # RegexValidator does not support deepcopy.
+ # We treat validator callables as immutable objects.
+ # See https://github.com/tomchristie/django-rest-framework/issues/1954
+ validators = kwargs.pop('validators', None)
+ kwargs = copy.deepcopy(kwargs)
+ if validators is not None:
+ kwargs['validators'] = validators
return self.__class__(*args, **kwargs)
def __repr__(self):
@@ -531,7 +539,7 @@ class RegexField(CharField):
def __init__(self, regex, **kwargs):
super(RegexField, self).__init__(**kwargs)
- validator = validators.RegexValidator(regex, message=self.error_messages['invalid'])
+ validator = RegexValidator(regex, message=self.error_messages['invalid'])
self.validators.append(validator)
@@ -543,7 +551,7 @@ class SlugField(CharField):
def __init__(self, **kwargs):
super(SlugField, self).__init__(**kwargs)
slug_regex = re.compile(r'^[-a-zA-Z0-9_]+$')
- validator = validators.RegexValidator(slug_regex, message=self.error_messages['invalid'])
+ validator = RegexValidator(slug_regex, message=self.error_messages['invalid'])
self.validators.append(validator)