diff options
| author | Jacob Magnusson | 2012-11-18 18:14:21 +0100 | 
|---|---|---|
| committer | Jacob Magnusson | 2012-11-18 18:14:21 +0100 | 
| commit | d67ee708e5d9f28f26377df391f5e72708e073d2 (patch) | |
| tree | 5af010c124e7ee12b6eaab0ccc2d681e02c1f507 | |
| parent | 346a79b170b0a25fd28354de765c5aa5aca9a119 (diff) | |
| download | django-rest-framework-d67ee708e5d9f28f26377df391f5e72708e073d2.tar.bz2 | |
Add support for min_length / max_length keywords
on basic ModelFields
| -rw-r--r-- | rest_framework/fields.py | 11 | ||||
| -rw-r--r-- | rest_framework/tests/models.py | 8 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 10 | 
3 files changed, 29 insertions, 0 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index c68c39b5..01cf5ae3 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -215,8 +215,19 @@ class ModelField(WritableField):              self.model_field = kwargs.pop('model_field')          except:              raise ValueError("ModelField requires 'model_field' kwarg") + +        self.min_length = kwargs.pop('min_length', +                            getattr(self.model_field, 'min_length', None)) +        self.max_length = kwargs.pop('max_length', +                            getattr(self.model_field, 'max_length', None)) +                  super(ModelField, self).__init__(*args, **kwargs) +        if self.min_length is not None: +            self.validators.append(validators.MinLengthValidator(self.min_length)) +        if self.max_length is not None: +            self.validators.append(validators.MaxLengthValidator(self.max_length)) +      def from_native(self, value):          rel = getattr(self.model_field, "rel", None)          if rel is not None: diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py index cbdc765c..59d81150 100644 --- a/rest_framework/tests/models.py +++ b/rest_framework/tests/models.py @@ -35,6 +35,13 @@ def foobar():      return 'foobar' +class CustomField(models.CharField): + +    def __init__(self, *args, **kwargs): +        kwargs['max_length'] = 12 +        super(CustomField, self).__init__(*args, **kwargs) + +  class RESTFrameworkModel(models.Model):      """      Base for test models that sets app_label, so they play nicely. @@ -113,6 +120,7 @@ class Comment(RESTFrameworkModel):  class ActionItem(RESTFrameworkModel):      title = models.CharField(max_length=200)      done = models.BooleanField(default=False) +    info = CustomField(default='---', max_length=12)  # Models for reverse relations diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index fb1be7eb..814c2499 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -41,6 +41,7 @@ class CommentSerializer(serializers.Serializer):  class ActionItemSerializer(serializers.ModelSerializer): +          class Meta:          model = ActionItem @@ -247,6 +248,15 @@ class ValidationTests(TestCase):          self.assertEquals(serializer.is_valid(), False)          self.assertEquals(serializer.errors, {'title': [u'Ensure this value has at most 200 characters (it has 201).']}) +    def test_default_modelfield_max_length_exceeded(self): +        data = { +            'title': 'Testing "info" field...', +            'info': 'x' * 13, +        } +        serializer = ActionItemSerializer(data=data) +        self.assertEquals(serializer.is_valid(), False) +        self.assertEquals(serializer.errors, {'info': [u'Ensure this value has at most 12 characters (it has 13).']}) +  class MetadataTests(TestCase):      def test_empty(self):  | 
