This commit is contained in:
Roarster 2012-10-29 14:24:01 -07:00
commit 39052dc198
4 changed files with 67 additions and 0 deletions

View File

@ -446,12 +446,23 @@ class CharField(WritableField):
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
self.max_length, self.min_length = max_length, min_length self.max_length, self.min_length = max_length, min_length
self.blank = kwargs.pop('blank', False)
super(CharField, self).__init__(*args, **kwargs) super(CharField, self).__init__(*args, **kwargs)
if min_length is not None: if min_length is not None:
self.validators.append(validators.MinLengthValidator(min_length)) self.validators.append(validators.MinLengthValidator(min_length))
if max_length is not None: if max_length is not None:
self.validators.append(validators.MaxLengthValidator(max_length)) 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): def from_native(self, value):
if isinstance(value, basestring) or value is None: if isinstance(value, basestring) or value is None:
return value return value

View File

@ -405,6 +405,9 @@ class ModelSerializer(Serializer):
kwargs['choices'] = model_field.flatchoices kwargs['choices'] = model_field.flatchoices
return ChoiceField(**kwargs) return ChoiceField(**kwargs)
if model_field.__class__ == models.TextField or model_field.__class__ == models.CharField:
kwargs['blank'] = model_field.blank
field_mapping = { field_mapping = {
models.FloatField: FloatField, models.FloatField: FloatField,
models.IntegerField: IntegerField, models.IntegerField: IntegerField,

View File

@ -116,3 +116,7 @@ class BlogPost(RESTFrameworkModel):
class BlogPostComment(RESTFrameworkModel): class BlogPostComment(RESTFrameworkModel):
text = models.TextField() text = models.TextField()
blog_post = models.ForeignKey(BlogPost) blog_post = models.ForeignKey(BlogPost)
# Model for issue #324
class BlankFieldModel(RESTFrameworkModel):
title = models.CharField(max_length=100, blank=True)

View File

@ -436,3 +436,52 @@ class ManyRelatedTests(TestCase):
} }
self.assertEqual(serializer.data, expected) 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)