aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2012-10-30 11:03:03 +0000
committerTom Christie2012-10-30 11:03:03 +0000
commit0047a4602045ed0ef9efae9aa88143aa6a70d93d (patch)
tree33f0bb55a446320afb524ab73a0724889c9a7775 /rest_framework
parent5670cb03bfa0ab62f90aed5fe3c62c5349d64264 (diff)
downloaddjango-rest-framework-0047a4602045ed0ef9efae9aa88143aa6a70d93d.tar.bz2
Merge fixes for 'blank=True' fields. Fixes #324, Fixes #325
Thanks to @Roarster.
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/fields.py13
-rw-r--r--rest_framework/serializers.py3
-rw-r--r--rest_framework/tests/models.py5
-rw-r--r--rest_framework/tests/serializer.py49
4 files changed, 69 insertions, 1 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 7dab15fa..090a1e37 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -114,7 +114,7 @@ class WritableField(Field):
def __init__(self, source=None, read_only=False, required=None,
validators=[], error_messages=None, widget=None,
- default=None):
+ default=None, blank=None):
super(WritableField, self).__init__(source=source)
@@ -133,6 +133,7 @@ class WritableField(Field):
self.validators = self.default_validators + validators
self.default = default or self.default
+ self.blank = blank
# Widgets are ony used for HTML forms.
widget = widget or self.widget
@@ -467,6 +468,16 @@ class CharField(WritableField):
if max_length is not None:
self.validators.append(validators.MaxLengthValidator(max_length))
+ def validate(self, value):
+ """
+ Validates that the value is supplied (if required).
+ """
+ # if empty string and allow blank
+ if self.blank and not value:
+ return
+ else:
+ super(CharField, self).validate(value)
+
def from_native(self, value):
if isinstance(value, basestring) or value is None:
return value
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 16e2c835..3d134a74 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -393,6 +393,9 @@ class ModelSerializer(Serializer):
Creates a default instance of a basic non-relational field.
"""
kwargs = {}
+
+ kwargs['blank'] = model_field.blank
+
if model_field.null:
kwargs['required'] = False
diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py
index fb23e359..415e4d06 100644
--- a/rest_framework/tests/models.py
+++ b/rest_framework/tests/models.py
@@ -121,3 +121,8 @@ class BlogPostComment(RESTFrameworkModel):
class Person(RESTFrameworkModel):
name = models.CharField(max_length=10)
age = models.IntegerField(null=True, blank=True)
+
+
+# Model for issue #324
+class BlankFieldModel(RESTFrameworkModel):
+ title = models.CharField(max_length=100, blank=True)
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index eb21dc46..d4b43862 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -449,3 +449,52 @@ class ManyRelatedTests(TestCase):
}
self.assertEqual(serializer.data, expected)
+
+
+# Test for issue #324
+class BlankFieldTests(TestCase):
+ def setUp(self):
+
+ class BlankFieldModelSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = BlankFieldModel
+
+ class BlankFieldSerializer(serializers.Serializer):
+ title = serializers.CharField(blank=True)
+
+ class NotBlankFieldModelSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = BasicModel
+
+ class NotBlankFieldSerializer(serializers.Serializer):
+ title = serializers.CharField()
+
+ self.model_serializer_class = BlankFieldModelSerializer
+ self.serializer_class = BlankFieldSerializer
+ self.not_blank_model_serializer_class = NotBlankFieldModelSerializer
+ self.not_blank_serializer_class = NotBlankFieldSerializer
+ self.data = {'title': ''}
+
+ def test_create_blank_field(self):
+ serializer = self.serializer_class(self.data)
+ self.assertEquals(serializer.is_valid(), True)
+
+ def test_create_model_blank_field(self):
+ serializer = self.model_serializer_class(self.data)
+ self.assertEquals(serializer.is_valid(), True)
+
+ def test_create_not_blank_field(self):
+ """
+ Test to ensure blank data in a field not marked as blank=True
+ is considered invalid in a non-model serializer
+ """
+ serializer = self.not_blank_serializer_class(self.data)
+ self.assertEquals(serializer.is_valid(), False)
+
+ def test_create_model_not_blank_field(self):
+ """
+ Test to ensure blank data in a field not marked as blank=True
+ is considered invalid in a model serializer
+ """
+ serializer = self.not_blank_model_serializer_class(self.data)
+ self.assertEquals(serializer.is_valid(), False)