aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/serializers.py
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/serializers.py')
-rw-r--r--rest_framework/serializers.py23
1 files changed, 21 insertions, 2 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 8d2e0feb..8e945688 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -32,6 +32,13 @@ from rest_framework.relations import *
from rest_framework.fields import *
+def pretty_name(name):
+ """Converts 'first_name' to 'First name'"""
+ if not name:
+ return ''
+ return name.replace('_', ' ').capitalize()
+
+
class RelationsList(list):
_deleted = []
@@ -301,14 +308,16 @@ class BaseSerializer(WritableField):
"""
ret = self._dict_class()
ret.fields = self._dict_class()
- ret.empty = obj is None
for field_name, field in self.fields.items():
+ if field.read_only and obj is None:
+ continue
field.initialize(parent=self, field_name=field_name)
key = self.get_field_key(field_name)
value = field.field_to_native(obj, field_name)
ret[key] = value
- ret.fields[key] = field
+ ret.fields[key] = self.augment_field(field, field_name, key, value)
+
return ret
def from_native(self, data, files):
@@ -316,6 +325,7 @@ class BaseSerializer(WritableField):
Deserialize primitives -> objects.
"""
self._errors = {}
+
if data is not None or files is not None:
attrs = self.restore_fields(data, files)
if attrs is not None:
@@ -326,6 +336,15 @@ class BaseSerializer(WritableField):
if not self._errors:
return self.restore_object(attrs, instance=getattr(self, 'object', None))
+ def augment_field(self, field, field_name, key, value):
+ # This horrible stuff is to manage serializers rendering to HTML
+ field._errors = self._errors.get(key) if self._errors else None
+ field._name = field_name
+ field._value = self.init_data.get(key) if self._errors and self.init_data else value
+ if not field.label:
+ field.label = pretty_name(key)
+ return field
+
def field_to_native(self, obj, field_name):
"""
Override default so that the serializer can be used as a nested field