aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-11-16 14:54:16 -0800
committerTom Christie2012-11-16 14:54:16 -0800
commite801e21210da829b2c22f1cdd22ac1e1374515b7 (patch)
tree6b98fae615ecf67930382860407ecf3c05ae4042
parent19b0516bfefe3398683b4f878774e3dd80bf653a (diff)
parent0076e2f462402dbb7bd7b3a446d2c397e6bf8d81 (diff)
downloaddjango-rest-framework-e801e21210da829b2c22f1cdd22ac1e1374515b7.tar.bz2
Merge pull request #422 from markotibold/max_length_for_modelserializers
Max length for modelserializers
-rw-r--r--docs/api-guide/fields.md12
-rw-r--r--rest_framework/fields.py17
-rw-r--r--rest_framework/serializers.py6
-rw-r--r--rest_framework/tests/serializer.py8
4 files changed, 43 insertions, 0 deletions
diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md
index 7f42dc5e..d1c31ecc 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.
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 70455667..c68c39b5 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -706,6 +706,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 e072564e..397866a7 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -429,6 +429,10 @@ class ModelSerializer(Serializer):
kwargs['choices'] = model_field.flatchoices
return ChoiceField(**kwargs)
+ max_length = getattr(model_field, 'max_length', None)
+ if max_length:
+ kwargs['max_length'] = max_length
+
field_mapping = {
models.FloatField: FloatField,
models.IntegerField: IntegerField,
@@ -439,6 +443,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 059593a9..fb1be7eb 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, {'title': [u'Ensure this value has at most 200 characters (it has 201).']})
+
class MetadataTests(TestCase):
def test_empty(self):