aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/fields.py4
-rw-r--r--rest_framework/request.py1
-rw-r--r--rest_framework/serializers.py9
-rw-r--r--rest_framework/tests/serializer.py10
-rw-r--r--rest_framework/tests/views.py4
5 files changed, 23 insertions, 5 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 336eac1e..33f25a00 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -161,7 +161,9 @@ class WritableField(Field):
try:
native = data[field_name]
except KeyError:
- return # TODO Consider validation behaviour, 'required' opt etc...
+ if self.required:
+ raise ValidationError(self.error_messages['required'])
+ return
value = self.from_native(native)
if self.source == '*':
diff --git a/rest_framework/request.py b/rest_framework/request.py
index 3ce93181..3725b3c9 100644
--- a/rest_framework/request.py
+++ b/rest_framework/request.py
@@ -225,7 +225,6 @@ class Request(object):
if (self._METHOD_PARAM and
self._METHOD_PARAM in self._data):
self._method = self._data[self._METHOD_PARAM].upper()
- self._data.pop(self._METHOD_PARAM)
# Content overloading - modify the content type, and force re-parse.
if (self._CONTENT_PARAM and
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 1770c4ce..2141619f 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -371,9 +371,14 @@ class ModelSerializer(Serializer):
models.BooleanField: BooleanField,
}
try:
- return field_mapping[model_field.__class__]()
+ ret = field_mapping[model_field.__class__]()
except KeyError:
- return ModelField(model_field=model_field)
+ ret = ModelField(model_field=model_field)
+
+ if model_field.default:
+ ret.required = False
+
+ return ret
def restore_object(self, attrs, instance=None):
"""
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index 08a7a9d0..4454791b 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -1,3 +1,4 @@
+import copy
import datetime
from django.test import TestCase
from rest_framework import serializers
@@ -93,6 +94,15 @@ class ValidationTests(TestCase):
self.assertEquals(serializer.is_valid(), False)
self.assertEquals(serializer.errors, {'content': [u'Ensure this value has at most 1000 characters (it has 1001).']})
+ def test_update_missing_field(self):
+ data = {
+ 'content': 'xxx',
+ 'created': datetime.datetime(2012, 1, 1)
+ }
+ serializer = CommentSerializer(data, instance=self.comment)
+ self.assertEquals(serializer.is_valid(), False)
+ self.assertEquals(serializer.errors, {'email': [u'This field is required.']})
+
class MetadataTests(TestCase):
def test_empty(self):
diff --git a/rest_framework/tests/views.py b/rest_framework/tests/views.py
index 61b288c6..3746d7c8 100644
--- a/rest_framework/tests/views.py
+++ b/rest_framework/tests/views.py
@@ -17,12 +17,14 @@ class BasicView(APIView):
return Response({'method': 'POST', 'data': request.DATA})
-@api_view(['GET', 'POST'])
+@api_view(['GET', 'POST', 'PUT'])
def basic_view(request):
if request.method == 'GET':
return {'method': 'GET'}
elif request.method == 'POST':
return {'method': 'POST', 'data': request.DATA}
+ elif request.method == 'PUT':
+ return {'method': 'PUT', 'data': request.DATA}
class ClassBasedViewIntegrationTests(TestCase):