Commit a96d0203 by Tom Christie

Merge pull request #1109 from thirstydigital/tickets/1105-renderer-context

Fixed #1105 -- Add hook for custom context in `BrowsableAPIRenderer`.
parents 068e4a18 a9dbd46c
...@@ -115,6 +115,7 @@ The context that's available to the template: ...@@ -115,6 +115,7 @@ The context that's available to the template:
* `name` : The name of the resource * `name` : The name of the resource
* `post_form` : A form instance for use by the POST form (if allowed) * `post_form` : A form instance for use by the POST form (if allowed)
* `put_form` : A form instance for use by the PUT form (if allowed) * `put_form` : A form instance for use by the PUT form (if allowed)
* `display_edit_forms` : A boolean indicating whether or not POST, PUT and PATCH forms will be displayed
* `request` : The request object * `request` : The request object
* `response` : The response object * `response` : The response object
* `version` : The version of Django REST Framework * `version` : The version of Django REST Framework
...@@ -122,6 +123,8 @@ The context that's available to the template: ...@@ -122,6 +123,8 @@ The context that's available to the template:
* `FORMAT_PARAM` : The view can accept a format override * `FORMAT_PARAM` : The view can accept a format override
* `METHOD_PARAM` : The view can accept a method override * `METHOD_PARAM` : The view can accept a method override
You can override the `BrowsableAPIRenderer.get_context()` method to customise the context that gets passed to the template.
#### Not using base.html #### Not using base.html
For more advanced customization, such as not having a Bootstrap basis or tighter integration with the rest of your site, you can simply choose not to have `api.html` extend `base.html`. Then the page content and capabilities are entirely up to you. For more advanced customization, such as not having a Bootstrap basis or tighter integration with the rest of your site, you can simply choose not to have `api.html` extend `base.html`. Then the page content and capabilities are entirely up to you.
......
...@@ -564,67 +564,65 @@ class BrowsableAPIRenderer(BaseRenderer): ...@@ -564,67 +564,65 @@ class BrowsableAPIRenderer(BaseRenderer):
def get_breadcrumbs(self, request): def get_breadcrumbs(self, request):
return get_breadcrumbs(request.path) return get_breadcrumbs(request.path)
def render(self, data, accepted_media_type=None, renderer_context=None): def get_context(self, data, accepted_media_type, renderer_context):
""" """
Render the HTML for the browsable API representation. Returns the context used to render.
""" """
self.accepted_media_type = accepted_media_type or ''
self.renderer_context = renderer_context or {}
view = renderer_context['view'] view = renderer_context['view']
request = renderer_context['request'] request = renderer_context['request']
response = renderer_context['response'] response = renderer_context['response']
renderer = self.get_default_renderer(view) renderer = self.get_default_renderer(view)
content = self.get_content(renderer, data, accepted_media_type, renderer_context)
put_form = self.get_rendered_html_form(view, 'PUT', request)
post_form = self.get_rendered_html_form(view, 'POST', request)
patch_form = self.get_rendered_html_form(view, 'PATCH', request)
delete_form = self.get_rendered_html_form(view, 'DELETE', request)
options_form = self.get_rendered_html_form(view, 'OPTIONS', request)
raw_data_put_form = self.get_raw_data_form(view, 'PUT', request) raw_data_put_form = self.get_raw_data_form(view, 'PUT', request)
raw_data_post_form = self.get_raw_data_form(view, 'POST', request)
raw_data_patch_form = self.get_raw_data_form(view, 'PATCH', request) raw_data_patch_form = self.get_raw_data_form(view, 'PATCH', request)
raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form
name = self.get_name(view) context = {
description = self.get_description(view) 'content': self.get_content(renderer, data, accepted_media_type, renderer_context),
breadcrumb_list = self.get_breadcrumbs(request)
template = loader.get_template(self.template)
context = RequestContext(request, {
'content': content,
'view': view, 'view': view,
'request': request, 'request': request,
'response': response, 'response': response,
'description': description, 'description': self.get_description(view),
'name': name, 'name': self.get_name(view),
'version': VERSION, 'version': VERSION,
'breadcrumblist': breadcrumb_list, 'breadcrumblist': self.get_breadcrumbs(request),
'allowed_methods': view.allowed_methods, 'allowed_methods': view.allowed_methods,
'available_formats': [renderer.format for renderer in view.renderer_classes], 'available_formats': [renderer.format for renderer in view.renderer_classes],
'put_form': put_form, 'put_form': self.get_rendered_html_form(view, 'PUT', request),
'post_form': post_form, 'post_form': self.get_rendered_html_form(view, 'POST', request),
'patch_form': patch_form, 'patch_form': self.get_rendered_html_form(view, 'PATCH', request),
'delete_form': delete_form, 'delete_form': self.get_rendered_html_form(view, 'DELETE', request),
'options_form': options_form, 'options_form': self.get_rendered_html_form(view, 'OPTIONS', request),
'raw_data_put_form': raw_data_put_form, 'raw_data_put_form': raw_data_put_form,
'raw_data_post_form': raw_data_post_form, 'raw_data_post_form': self.get_raw_data_form(view, 'POST', request),
'raw_data_patch_form': raw_data_patch_form, 'raw_data_patch_form': raw_data_patch_form,
'raw_data_put_or_patch_form': raw_data_put_or_patch_form, 'raw_data_put_or_patch_form': raw_data_put_or_patch_form,
'display_edit_forms': bool(response.status_code != 403),
'api_settings': api_settings 'api_settings': api_settings
}) }
return context
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
Render the HTML for the browsable API representation.
"""
self.accepted_media_type = accepted_media_type or ''
self.renderer_context = renderer_context or {}
template = loader.get_template(self.template)
context = self.get_context(data, accepted_media_type, renderer_context)
context = RequestContext(renderer_context['request'], context)
ret = template.render(context) ret = template.render(context)
# Munge DELETE Response code to allow us to return content # Munge DELETE Response code to allow us to return content
# (Do this *after* we've rendered the template so that we include # (Do this *after* we've rendered the template so that we include
# the normal deletion response code in the output) # the normal deletion response code in the output)
response = renderer_context['response']
if response.status_code == status.HTTP_204_NO_CONTENT: if response.status_code == status.HTTP_204_NO_CONTENT:
response.status_code = status.HTTP_200_OK response.status_code = status.HTTP_200_OK
......
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
</div> </div>
</div> </div>
{% if response.status_code != 403 %} {% if display_edit_forms %}
{% if post_form or raw_data_post_form %} {% if post_form or raw_data_post_form %}
<div {% if post_form %}class="tabbable"{% endif %}> <div {% if post_form %}class="tabbable"{% endif %}>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment