From 4edc801d5912b2c31855647b432e461e35322511 Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Fri, 16 Nov 2012 21:42:04 +0100 Subject: [PATCH 1/5] Reproduces #421 --- rest_framework/tests/serializer.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 059593a90..a51df1465 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -239,6 +239,14 @@ class ValidationTests(TestCase): self.assertEquals(serializer.is_valid(), True) self.assertEquals(serializer.errors, {}) + def test_modelserializer_max_length_exceeded(self): + data = { + 'title': 'x' * 201, + } + serializer = ActionItemSerializer(data=data) + self.assertEquals(serializer.is_valid(), False) + self.assertEquals(serializer.errors, {'content': [u'Ensure this value has at most 200 characters (it has 201).']}) + class MetadataTests(TestCase): def test_empty(self): From aa013a428948802dff9c8ca00df3b7af6faf139b Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Fri, 16 Nov 2012 22:18:57 +0100 Subject: [PATCH 2/5] Fixes #421 --- rest_framework/serializers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 0f943ac15..e5c057fbe 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -427,6 +427,12 @@ class ModelSerializer(Serializer): kwargs['choices'] = model_field.flatchoices return ChoiceField(**kwargs) + max_length = getattr(model_field, 'max_length', None) + if max_length: + if not isinstance(model_field, models.CharField): + import pdb; pdb.set_trace() + kwargs['max_length'] = max_length + field_mapping = { models.FloatField: FloatField, models.IntegerField: IntegerField, From f385b72d80b7e9767a6f345496fd108ccc66a4bc Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Fri, 16 Nov 2012 22:20:26 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Whoops=20=E2=80=A6=20Drop=20pdb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rest_framework/serializers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index e5c057fbe..8f4b7ae20 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -429,8 +429,6 @@ class ModelSerializer(Serializer): max_length = getattr(model_field, 'max_length', None) if max_length: - if not isinstance(model_field, models.CharField): - import pdb; pdb.set_trace() kwargs['max_length'] = max_length field_mapping = { From 1a436dd6d9f56b62de61c55c89084d60c09966ba Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Fri, 16 Nov 2012 22:43:16 +0100 Subject: [PATCH 4/5] Added URLField and SlugField. Fixed test_modelserializer_max_length_exceeded --- rest_framework/fields.py | 17 +++++++++++++++++ rest_framework/serializers.py | 2 ++ rest_framework/tests/serializer.py | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 6ef539754..641a1417e 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -700,6 +700,23 @@ class CharField(WritableField): return smart_unicode(value) +class URLField(CharField): + type_name = 'URLField' + + def __init__(self, **kwargs): + kwargs['max_length'] = kwargs.get('max_length', 200) + kwargs['validators'] = [validators.URLValidator()] + super(URLField, self).__init__(**kwargs) + + +class SlugField(CharField): + type_name = 'SlugField' + + def __init__(self, *args, **kwargs): + kwargs['max_length'] = kwargs.get('max_length', 50) + super(SlugField, self).__init__(*args, **kwargs) + + class ChoiceField(WritableField): type_name = 'ChoiceField' widget = widgets.Select diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8f4b7ae20..dbd9fe271 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -441,6 +441,8 @@ class ModelSerializer(Serializer): models.DateField: DateField, models.EmailField: EmailField, models.CharField: CharField, + models.URLField: URLField, + models.SlugField: SlugField, models.TextField: CharField, models.CommaSeparatedIntegerField: CharField, models.BooleanField: BooleanField, diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index a51df1465..fb1be7eb0 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -245,7 +245,7 @@ class ValidationTests(TestCase): } serializer = ActionItemSerializer(data=data) self.assertEquals(serializer.is_valid(), False) - self.assertEquals(serializer.errors, {'content': [u'Ensure this value has at most 200 characters (it has 201).']}) + self.assertEquals(serializer.errors, {'title': [u'Ensure this value has at most 200 characters (it has 201).']}) class MetadataTests(TestCase): From 0076e2f462402dbb7bd7b3a446d2c397e6bf8d81 Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Fri, 16 Nov 2012 23:23:34 +0100 Subject: [PATCH 5/5] Added brief docs for URLField and SlugField. --- docs/api-guide/fields.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md index 0485b158f..5977cae2e 100644 --- a/docs/api-guide/fields.md +++ b/docs/api-guide/fields.md @@ -131,6 +131,18 @@ or `django.db.models.fields.TextField`. **Signature:** `CharField(max_length=None, min_length=None)` +## URLField + +Corresponds to `django.db.models.fields.URLField`. Uses Django's `django.core.validators.URLValidator` for validation. + +**Signature:** `CharField(max_length=200, min_length=None)` + +## SlugField + +Corresponds to `django.db.models.fields.SlugField`. + +**Signature:** `CharField(max_length=50, min_length=None)` + ## ChoiceField A field that can accept a value out of a limited set of choices.