Skip to content

Commit 41182c6

Browse files
committed
Formns API
1 parent 63662e3 commit 41182c6

File tree

8 files changed

+41
-70
lines changed

8 files changed

+41
-70
lines changed

docs/api-guide/renderers.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,17 +197,25 @@ Note that views that have nested or list serializers for their input won't work
197197

198198
## HTMLFormRenderer
199199

200-
Renders data returned by a serializer into an HTML form. The output of this renderer does not include the enclosing `<form>` tags or an submit actions, as you'll probably need those to include the desired method and URL. Also note that the `HTMLFormRenderer` does not yet support including field error messages.
200+
Renders data returned by a serializer into an HTML form. The output of this renderer does not include the enclosing `<form>` tags, a hidden CSRF input or any submit buttons.
201201

202-
**Note**: The `HTMLFormRenderer` class is intended for internal use with the browsable API and admin interface. It should not be considered a fully documented or stable API. The template used by the `HTMLFormRenderer` class, and the context submitted to it **may be subject to change**. If you need to use this renderer class it is advised that you either make a local copy of the class and templates, or follow the release note on REST framework upgrades closely.
202+
This renderer is not intended to be used directly, but can instead be used in templates by passing a serializer instance to the `render_form` template tag.
203+
204+
{% load rest_framework %}
205+
206+
<form action="/submit-report/" method="post">
207+
{% csrf_token %}
208+
{% render_form serializer %}
209+
<input type="submit" value="Save" />
210+
</form>
203211

204212
**.media_type**: `text/html`
205213

206214
**.format**: `'.form'`
207215

208216
**.charset**: `utf-8`
209217

210-
**.template**: `'rest_framework/form.html'`
218+
**.template**: `'rest_framework/horizontal/form.html'`
211219

212220
## MultiPartRenderer
213221

rest_framework/renderers.py

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -341,26 +341,16 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
341341
Render serializer data and return an HTML form, as a string.
342342
"""
343343
form = data.serializer
344-
meta = getattr(form, 'Meta', None)
345-
style = getattr(meta, 'style', {})
344+
345+
style = renderer_context.get('style', {})
346346
if 'template_pack' not in style:
347347
style['template_pack'] = self.template_pack
348-
if 'base_template' not in style:
349-
style['base_template'] = self.base_template
350348
style['renderer'] = self
351349

352-
# This API needs to be finessed and finalized for 3.1
353-
if 'template' in renderer_context:
354-
template_name = renderer_context['template']
355-
elif 'template' in style:
356-
template_name = style['template']
357-
else:
358-
template_name = style['template_pack'].strip('/') + '/' + style['base_template']
359-
360-
renderer_context = renderer_context or {}
361-
request = renderer_context['request']
350+
template_pack = style['template_pack'].strip('/')
351+
template_name = template_pack + '/' + self.base_template
362352
template = loader.get_template(template_name)
363-
context = RequestContext(request, {
353+
context = Context({
364354
'form': form,
365355
'style': style
366356
})
@@ -505,10 +495,7 @@ def get_rendered_html_form(self, data, view, method, request):
505495
return form_renderer.render(
506496
serializer.data,
507497
self.accepted_media_type,
508-
dict(
509-
list(self.renderer_context.items()) +
510-
[('template', 'rest_framework/api_form.html')]
511-
)
498+
self.renderer_context
512499
)
513500

514501
def get_raw_data_form(self, data, view, method, request):

rest_framework/templates/rest_framework/api_form.html

Lines changed: 0 additions & 8 deletions
This file was deleted.

rest_framework/templates/rest_framework/base.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ <h1>{{ name }}</h1>
154154
{% with form=post_form %}
155155
<form action="{{ request.get_full_path }}" method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
156156
<fieldset>
157+
{% csrf_token %}
157158
{{ post_form }}
158159
<div class="form-actions">
159160
<button class="btn btn-primary" title="Make a POST request on the {{ name }} resource">POST</button>
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
{% load rest_framework %}
2-
3-
<form class="form-horizontal" role="form" action="." method="POST" novalidate>
4-
{% csrf_token %}
5-
{% for field in form %}
6-
{% if not field.read_only %}
7-
{% render_field field style=style %}
8-
{% endif %}
9-
{% endfor %}
10-
11-
<div class="form-group">
12-
<div class="col-sm-offset-2 col-sm-10">
13-
<button type="submit" class="btn btn-default">Submit</button>
14-
</div>
15-
</div>
16-
</form>
2+
{% for field in form %}
3+
{% if not field.read_only %}
4+
{% render_field field style=style %}
5+
{% endif %}
6+
{% endfor %}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
{% load rest_framework %}
2-
3-
<form class="form-inline" role="form" action="." method="POST" novalidate>
4-
{% csrf_token %}
5-
6-
{% for field in form %}
7-
{% if not field.read_only %}
8-
{% render_field field style=style %}
9-
{% endif %}
10-
{% endfor %}
11-
12-
<button type="submit" class="btn btn-default">Submit</button>
13-
</form>
2+
{% for field in form %}
3+
{% if not field.read_only %}
4+
{% render_field field style=style %}
5+
{% endif %}
6+
{% endfor %}
Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
{% load rest_framework %}
2-
3-
<form role="form" action="." method="POST" novalidate>
4-
{% csrf_token %}
5-
{% for field in form %}
6-
{% if not field.read_only %}
7-
{% render_field field style=style %}
8-
{% endif %}
9-
{% endfor %}
10-
11-
<button type="submit" class="btn btn-default">Submit</button>
12-
</form>
2+
{% for field in form %}
3+
{% if not field.read_only %}
4+
{% render_field field style=style %}
5+
{% endif %}
6+
{% endfor %}

rest_framework/templatetags/rest_framework.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,14 @@ def get_pagination_html(pager):
2525

2626

2727
@register.simple_tag
28-
def render_field(field, style=None):
29-
style = style or {}
28+
def render_form(serializer, template_pack=None):
29+
style = {'template_pack': template_pack} if template_pack else {}
30+
renderer = HTMLFormRenderer()
31+
return renderer.render(serializer.data, None, {'style': style})
32+
33+
34+
@register.simple_tag
35+
def render_field(field, style):
3036
renderer = style.get('renderer', HTMLFormRenderer())
3137
return renderer.render_field(field, style)
3238

0 commit comments

Comments
 (0)