diff --git a/rest_framework/templates/rest_framework/horizontal/select.html b/rest_framework/templates/rest_framework/horizontal/select.html
index 1ea5c16e23..5a57cfb1c1 100644
--- a/rest_framework/templates/rest_framework/horizontal/select.html
+++ b/rest_framework/templates/rest_framework/horizontal/select.html
@@ -16,7 +16,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% endfor %}
diff --git a/rest_framework/templates/rest_framework/horizontal/select_multiple.html b/rest_framework/templates/rest_framework/horizontal/select_multiple.html
index b00a63fbe9..bb30996edb 100644
--- a/rest_framework/templates/rest_framework/horizontal/select_multiple.html
+++ b/rest_framework/templates/rest_framework/horizontal/select_multiple.html
@@ -16,7 +16,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% empty %}
diff --git a/rest_framework/templates/rest_framework/inline/select.html b/rest_framework/templates/rest_framework/inline/select.html
index 99f10ae712..2796dba241 100644
--- a/rest_framework/templates/rest_framework/inline/select.html
+++ b/rest_framework/templates/rest_framework/inline/select.html
@@ -15,7 +15,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% endfor %}
diff --git a/rest_framework/templates/rest_framework/inline/select_multiple.html b/rest_framework/templates/rest_framework/inline/select_multiple.html
index 1c0e96b3c1..a9bd08be1d 100644
--- a/rest_framework/templates/rest_framework/inline/select_multiple.html
+++ b/rest_framework/templates/rest_framework/inline/select_multiple.html
@@ -15,7 +15,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% empty %}
diff --git a/rest_framework/templates/rest_framework/vertical/select.html b/rest_framework/templates/rest_framework/vertical/select.html
index 973efb6797..dceaa5c9b6 100644
--- a/rest_framework/templates/rest_framework/vertical/select.html
+++ b/rest_framework/templates/rest_framework/vertical/select.html
@@ -15,7 +15,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% endfor %}
diff --git a/rest_framework/templates/rest_framework/vertical/select_multiple.html b/rest_framework/templates/rest_framework/vertical/select_multiple.html
index dcbee2eda5..a04cfbfd64 100644
--- a/rest_framework/templates/rest_framework/vertical/select_multiple.html
+++ b/rest_framework/templates/rest_framework/vertical/select_multiple.html
@@ -15,7 +15,7 @@
{% elif select.end_option_group %}
{% else %}
-
+
{% endif %}
{% empty %}
diff --git a/rest_framework/utils/serializer_helpers.py b/rest_framework/utils/serializer_helpers.py
index cfaeb25e8b..75bcf5c49c 100644
--- a/rest_framework/utils/serializer_helpers.py
+++ b/rest_framework/utils/serializer_helpers.py
@@ -8,6 +8,10 @@
from rest_framework.compat import unicode_to_repr
+# A singleton helper value to detect unset keyword arguments
+unset = object()
+
+
class ReturnDict(OrderedDict):
"""
Return object from `serialier.data` for the `Serializer` class.
@@ -58,10 +62,11 @@ class BoundField(object):
providing an API similar to Django forms and form fields.
"""
- def __init__(self, field, value, errors, prefix=''):
+ def __init__(self, field, value, errors, prefix='', basic_value=unset):
self._field = field
self._prefix = prefix
self.value = value
+ self.basic_value = value if basic_value is unset else basic_value
self.errors = errors
self.name = prefix + self.field_name
@@ -79,7 +84,8 @@ def __repr__(self):
def as_form_field(self):
value = '' if (self.value is None or self.value is False) else force_text(self.value)
- return self.__class__(self._field, value, self.errors, self._prefix)
+ return self.__class__(self._field, value, self.errors, self._prefix,
+ self.basic_value)
class NestedBoundField(BoundField):
@@ -89,10 +95,11 @@ class NestedBoundField(BoundField):
`BoundField` that is used for serializer fields.
"""
- def __init__(self, field, value, errors, prefix=''):
+ def __init__(self, field, value, errors, prefix='', basic_value=unset):
if value is None or value is '':
value = {}
- super(NestedBoundField, self).__init__(field, value, errors, prefix)
+ super(NestedBoundField, self).__init__(field, value, errors, prefix,
+ basic_value)
def __iter__(self):
for field in self.fields.values():
@@ -113,7 +120,8 @@ def as_form_field(self):
values[key] = value
else:
values[key] = '' if (value is None or value is False) else force_text(value)
- return self.__class__(self._field, values, self.errors, self._prefix)
+ return self.__class__(self._field, values, self.errors, self._prefix,
+ self.basic_value)
class BindingDict(collections.MutableMapping):