diff options
| author | Tom Christie | 2014-11-20 13:44:35 +0000 |
|---|---|---|
| committer | Tom Christie | 2014-11-20 13:44:35 +0000 |
| commit | d80d58e91a62941a1bdad4263886a109b6003e53 (patch) | |
| tree | 9040101c7d3f1f717e4bf57197d8fb76fcc5d575 | |
| parent | 096c58b784faee6b3c71201ad8b2708f7ccd5f7f (diff) | |
| parent | 6ec96d0bac1e738aceec9f8c21282c172120c7ac (diff) | |
| download | django-rest-framework-d80d58e91a62941a1bdad4263886a109b6003e53.tar.bz2 | |
Merge branch 'master' into 3.0-beta
| -rw-r--r-- | rest_framework/exceptions.py | 32 | ||||
| -rw-r--r-- | rest_framework/fields.py | 4 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 14 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/api_form.html | 8 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/horizontal/select.html | 3 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/inline/select.html | 5 | ||||
| -rw-r--r-- | rest_framework/templates/rest_framework/vertical/select.html | 5 |
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 %} |
