diff options
| author | Tom Christie | 2012-10-30 11:03:03 +0000 | 
|---|---|---|
| committer | Tom Christie | 2012-10-30 11:03:03 +0000 | 
| commit | 0047a4602045ed0ef9efae9aa88143aa6a70d93d (patch) | |
| tree | 33f0bb55a446320afb524ab73a0724889c9a7775 /rest_framework | |
| parent | 5670cb03bfa0ab62f90aed5fe3c62c5349d64264 (diff) | |
| download | django-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.py | 13 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 3 | ||||
| -rw-r--r-- | rest_framework/tests/models.py | 5 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 49 | 
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)  | 
