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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy