Skip to content

Commit d80d58e

Browse files
committed
Merge branch 'master' into 3.0-beta
2 parents 096c58b + 6ec96d0 commit d80d58e

File tree

7 files changed

+53
-18
lines changed

7 files changed

+53
-18
lines changed

rest_framework/exceptions.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@
1313
import math
1414

1515

16+
def _force_text_recursive(data):
17+
"""
18+
Descend into a nested data structure, forcing any
19+
lazy translation strings into plain text.
20+
"""
21+
if isinstance(data, list):
22+
return [
23+
_force_text_recursive(item) for item in data
24+
]
25+
elif isinstance(data, dict):
26+
return dict([
27+
(key, _force_text_recursive(value))
28+
for key, value in data.items()
29+
])
30+
return force_text(data)
31+
32+
1633
class APIException(Exception):
1734
"""
1835
Base class for REST framework exceptions.
@@ -38,19 +55,6 @@ def __str__(self):
3855
# from rest_framework import serializers
3956
# raise serializers.ValidationError('Value was invalid')
4057

41-
def force_text_recursive(data):
42-
if isinstance(data, list):
43-
return [
44-
force_text_recursive(item) for item in data
45-
]
46-
elif isinstance(data, dict):
47-
return dict([
48-
(key, force_text_recursive(value))
49-
for key, value in data.items()
50-
])
51-
return force_text(data)
52-
53-
5458
class ValidationError(APIException):
5559
status_code = status.HTTP_400_BAD_REQUEST
5660

@@ -59,7 +63,7 @@ def __init__(self, detail):
5963
# The details should always be coerced to a list if not already.
6064
if not isinstance(detail, dict) and not isinstance(detail, list):
6165
detail = [detail]
62-
self.detail = force_text_recursive(detail)
66+
self.detail = _force_text_recursive(detail)
6367

6468
def __str__(self):
6569
return str(self.detail)

rest_framework/fields.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ def __init__(self, read_only=False, write_only=False,
181181
self.style = {} if style is None else style
182182
self.allow_null = allow_null
183183

184+
if allow_null and self.default_empty_html is empty:
185+
self.default_empty_html = None
186+
184187
if validators is not None:
185188
self.validators = validators[:]
186189

@@ -495,6 +498,7 @@ class CharField(Field):
495498
}
496499
initial = ''
497500
coerce_blank_to_null = False
501+
default_empty_html = ''
498502

499503
def __init__(self, **kwargs):
500504
self.allow_blank = kwargs.pop('allow_blank', False)

rest_framework/renderers.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,10 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
429429
style['base_template'] = self.base_template
430430
style['renderer'] = self
431431

432-
if 'template' in style:
432+
# This API needs to be finessed and finalized for 3.1
433+
if 'template' in renderer_context:
434+
template_name = renderer_context['template']
435+
elif 'template' in style:
433436
template_name = style['template']
434437
else:
435438
template_name = style['template_pack'].strip('/') + '/' + style['base_template']
@@ -555,7 +558,14 @@ def get_rendered_html_form(self, data, view, method, request):
555558
if data is not None:
556559
serializer.is_valid()
557560
form_renderer = self.form_renderer_class()
558-
return form_renderer.render(serializer.data, self.accepted_media_type, self.renderer_context)
561+
return form_renderer.render(
562+
serializer.data,
563+
self.accepted_media_type,
564+
dict(
565+
self.renderer_context.items() +
566+
[('template', 'rest_framework/api_form.html')]
567+
)
568+
)
559569

560570
def get_raw_data_form(self, data, view, method, request):
561571
"""
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% load rest_framework %}
2+
{% csrf_token %}
3+
{% for field in form %}
4+
{% if not field.read_only %}
5+
{% render_field field style=style %}
6+
{% endif %}
7+
{% endfor %}
8+
<!-- form.non_field_errors -->

rest_framework/templates/rest_framework/horizontal/select.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
{% endif %}
55
<div class="col-sm-10">
66
<select class="form-control" name="{{ field.name }}">
7+
{% if field.allow_null %}
8+
<option value="" {% if not field.value %}selected{% endif %}>--------</option>
9+
{% endif %}
710
{% for key, text in field.choices.items %}
811
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
912
{% endfor %}

rest_framework/templates/rest_framework/inline/select.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
<label class="sr-only">{{ field.label }}</label>
44
{% endif %}
55
<select class="form-control" name="{{ field.name }}">
6+
{% if field.allow_null %}
7+
<option value="" {% if not field.value %}selected{% endif %}>--------</option>
8+
{% endif %}
69
{% for key, text in field.choices.items %}
7-
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
10+
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
811
{% endfor %}
912
</select>
1013
</div>

rest_framework/templates/rest_framework/vertical/select.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
<label {% if style.hide_label %}class="sr-only"{% endif %}>{{ field.label }}</label>
44
{% endif %}
55
<select class="form-control" name="{{ field.name }}">
6+
{% if field.allow_null %}
7+
<option value="" {% if not field.value %}selected{% endif %}>--------</option>
8+
{% endif %}
69
{% for key, text in field.choices.items %}
7-
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
10+
<option value="{{ key }}" {% if key == field.value %}selected{% endif %}>{{ text }}</option>
811
{% endfor %}
912
</select>
1013
{% if field.errors %}

0 commit comments

Comments
 (0)