aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-11-20 13:44:35 +0000
committerTom Christie2014-11-20 13:44:35 +0000
commitd80d58e91a62941a1bdad4263886a109b6003e53 (patch)
tree9040101c7d3f1f717e4bf57197d8fb76fcc5d575
parent096c58b784faee6b3c71201ad8b2708f7ccd5f7f (diff)
parent6ec96d0bac1e738aceec9f8c21282c172120c7ac (diff)
downloaddjango-rest-framework-d80d58e91a62941a1bdad4263886a109b6003e53.tar.bz2
Merge branch 'master' into 3.0-beta
-rw-r--r--rest_framework/exceptions.py32
-rw-r--r--rest_framework/fields.py4
-rw-r--r--rest_framework/renderers.py14
-rw-r--r--rest_framework/templates/rest_framework/api_form.html8
-rw-r--r--rest_framework/templates/rest_framework/horizontal/select.html3
-rw-r--r--rest_framework/templates/rest_framework/inline/select.html5
-rw-r--r--rest_framework/templates/rest_framework/vertical/select.html5
7 files changed, 53 insertions, 18 deletions
diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py
index dbab6684..906de3b0 100644
--- a/rest_framework/exceptions.py
+++ b/rest_framework/exceptions.py
@@ -13,6 +13,23 @@ from rest_framework.compat import force_text
import math
+def _force_text_recursive(data):
+ """
+ Descend into a nested data structure, forcing any
+ lazy translation strings into plain text.
+ """
+ if isinstance(data, list):
+ return [
+ _force_text_recursive(item) for item in data
+ ]
+ elif isinstance(data, dict):
+ return dict([
+ (key, _force_text_recursive(value))
+ for key, value in data.items()
+ ])
+ return force_text(data)
+
+
class APIException(Exception):
"""
Base class for REST framework exceptions.
@@ -38,19 +55,6 @@ class APIException(Exception):
# from rest_framework import serializers
# raise serializers.ValidationError('Value was invalid')
-def force_text_recursive(data):
- if isinstance(data, list):
- return [
- force_text_recursive(item) for item in data
- ]
- elif isinstance(data, dict):
- return dict([
- (key, force_text_recursive(value))
- for key, value in data.items()
- ])
- return force_text(data)
-
-
class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST
@@ -59,7 +63,7 @@ class ValidationError(APIException):
# The details should always be coerced to a list if not already.
if not isinstance(detail, dict) and not isinstance(detail, list):
detail = [detail]
- self.detail = force_text_recursive(detail)
+ self.detail = _force_text_recursive(detail)
def __str__(self):
return str(self.detail)
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index bb43708d..778bc718 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -181,6 +181,9 @@ class Field(object):
self.style = {} if style is None else style
self.allow_null = allow_null
+ if allow_null and self.default_empty_html is empty:
+ self.default_empty_html = None
+
if validators is not None:
self.validators = validators[:]
@@ -495,6 +498,7 @@ class CharField(Field):
}
initial = ''
coerce_blank_to_null = False
+ default_empty_html = ''
def __init__(self, **kwargs):
self.allow_blank = kwargs.pop('allow_blank', False)
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py
index 6596fc44..8717137a 100644
--- a/rest_framework/renderers.py
+++ b/rest_framework/renderers.py
@@ -429,7 +429,10 @@ class HTMLFormRenderer(BaseRenderer):
style['base_template'] = self.base_template
style['renderer'] = self
- if 'template' in style:
+ # This API needs to be finessed and finalized for 3.1
+ if 'template' in renderer_context:
+ template_name = renderer_context['template']
+ elif 'template' in style:
template_name = style['template']
else:
template_name = style['template_pack'].strip('/') + '/' + style['base_template']
@@ -555,7 +558,14 @@ class BrowsableAPIRenderer(BaseRenderer):
if data is not None:
serializer.is_valid()
form_renderer = self.form_renderer_class()
- return form_renderer.render(serializer.data, self.accepted_media_type, self.renderer_context)
+ return form_renderer.render(
+ serializer.data,
+ self.accepted_media_type,
+ dict(
+ self.renderer_context.items() +
+ [('template', 'rest_framework/api_form.html')]
+ )
+ )
def get_raw_data_form(self, data, view, method, request):
"""
diff --git a/rest_framework/templates/rest_framework/api_form.html b/rest_framework/templates/rest_framework/api_form.html
new file mode 100644
index 00000000..96f924ed
--- /dev/null
+++ b/rest_framework/templates/rest_framework/api_form.html
@@ -0,0 +1,8 @@
+{% load rest_framework %}
+{% csrf_token %}
+{% for field in form %}
+ {% if not field.read_only %}
+ {% render_field field style=style %}
+ {% endif %}
+{% endfor %}
+<!-- form.non_field_errors -->
diff --git a/rest_framework/templates/rest_framework/horizontal/select.html b/rest_framework/templates/rest_framework/horizontal/select.html
index 1d00f424..380b38e9 100644
--- a/rest_framework/templates/rest_framework/horizontal/select.html
+++ b/rest_framework/templates/rest_framework/horizontal/select.html
@@ -4,6 +4,9 @@
{% endif %}
<div class="col-sm-10">
<select class="form-control" name="{{ field.name }}">
+ {% if field.allow_null %}
+ <option value="" {% if not field.value %}selected{% endif %}>--------</option>
+ {% endif %}
{% for key, text in field.choices.items %}
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
{% endfor %}
diff --git a/rest_framework/templates/rest_framework/inline/select.html b/rest_framework/templates/rest_framework/inline/select.html
index e9fcebb4..53af2772 100644
--- a/rest_framework/templates/rest_framework/inline/select.html
+++ b/rest_framework/templates/rest_framework/inline/select.html
@@ -3,8 +3,11 @@
<label class="sr-only">{{ field.label }}</label>
{% endif %}
<select class="form-control" name="{{ field.name }}">
+ {% if field.allow_null %}
+ <option value="" {% if not field.value %}selected{% endif %}>--------</option>
+ {% endif %}
{% for key, text in field.choices.items %}
- <option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
+ <option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
{% endfor %}
</select>
</div>
diff --git a/rest_framework/templates/rest_framework/vertical/select.html b/rest_framework/templates/rest_framework/vertical/select.html
index 7c673ebb..de72e1dd 100644
--- a/rest_framework/templates/rest_framework/vertical/select.html
+++ b/rest_framework/templates/rest_framework/vertical/select.html
@@ -3,8 +3,11 @@
<label {% if style.hide_label %}class="sr-only"{% endif %}>{{ field.label }}</label>
{% endif %}
<select class="form-control" name="{{ field.name }}">
+ {% if field.allow_null %}
+ <option value="" {% if not field.value %}selected{% endif %}>--------</option>
+ {% endif %}
{% for key, text in field.choices.items %}
- <option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
+ <option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
{% endfor %}
</select>
{% if field.errors %}