Merge fixes for 'blank=True' fields. Fixes #324, Fixes #325

Thanks to @Roarster.
This commit is contained in:
Tom Christie 2012-10-30 11:03:03 +00:00
parent 5670cb03bf
commit 0047a46020
4 changed files with 69 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)