mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-03 05:04:31 +03:00
Merge pull request #1109 from thirstydigital/tickets/1105-renderer-context
Fixed #1105 -- Add hook for custom context in `BrowsableAPIRenderer`.
This commit is contained in:
commit
a96d0203fe
|
@ -115,6 +115,7 @@ The context that's available to the template:
|
|||
* `name` : The name of the resource
|
||||
* `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)
|
||||
* `display_edit_forms` : A boolean indicating whether or not POST, PUT and PATCH forms will be displayed
|
||||
* `request` : The request object
|
||||
* `response` : The response object
|
||||
* `version` : The version of Django REST Framework
|
||||
|
@ -122,6 +123,8 @@ The context that's available to the template:
|
|||
* `FORMAT_PARAM` : The view can accept a format 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
|
||||
|
||||
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,6 +564,49 @@ class BrowsableAPIRenderer(BaseRenderer):
|
|||
def get_breadcrumbs(self, request):
|
||||
return get_breadcrumbs(request.path)
|
||||
|
||||
def get_context(self, data, accepted_media_type, renderer_context):
|
||||
"""
|
||||
Returns the context used to render.
|
||||
"""
|
||||
view = renderer_context['view']
|
||||
request = renderer_context['request']
|
||||
response = renderer_context['response']
|
||||
|
||||
renderer = self.get_default_renderer(view)
|
||||
|
||||
raw_data_put_form = self.get_raw_data_form(view, 'PUT', 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
|
||||
|
||||
context = {
|
||||
'content': self.get_content(renderer, data, accepted_media_type, renderer_context),
|
||||
'view': view,
|
||||
'request': request,
|
||||
'response': response,
|
||||
'description': self.get_description(view),
|
||||
'name': self.get_name(view),
|
||||
'version': VERSION,
|
||||
'breadcrumblist': self.get_breadcrumbs(request),
|
||||
'allowed_methods': view.allowed_methods,
|
||||
'available_formats': [renderer.format for renderer in view.renderer_classes],
|
||||
|
||||
'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': raw_data_put_form,
|
||||
'raw_data_post_form': self.get_raw_data_form(view, 'POST', request),
|
||||
'raw_data_patch_form': raw_data_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
|
||||
}
|
||||
return context
|
||||
|
||||
def render(self, data, accepted_media_type=None, renderer_context=None):
|
||||
"""
|
||||
Render the HTML for the browsable API representation.
|
||||
|
@ -571,60 +614,15 @@ class BrowsableAPIRenderer(BaseRenderer):
|
|||
self.accepted_media_type = accepted_media_type or ''
|
||||
self.renderer_context = renderer_context or {}
|
||||
|
||||
view = renderer_context['view']
|
||||
request = renderer_context['request']
|
||||
response = renderer_context['response']
|
||||
|
||||
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_post_form = self.get_raw_data_form(view, 'POST', 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
|
||||
|
||||
name = self.get_name(view)
|
||||
description = self.get_description(view)
|
||||
breadcrumb_list = self.get_breadcrumbs(request)
|
||||
|
||||
template = loader.get_template(self.template)
|
||||
context = RequestContext(request, {
|
||||
'content': content,
|
||||
'view': view,
|
||||
'request': request,
|
||||
'response': response,
|
||||
'description': description,
|
||||
'name': name,
|
||||
'version': VERSION,
|
||||
'breadcrumblist': breadcrumb_list,
|
||||
'allowed_methods': view.allowed_methods,
|
||||
'available_formats': [renderer.format for renderer in view.renderer_classes],
|
||||
|
||||
'put_form': put_form,
|
||||
'post_form': post_form,
|
||||
'patch_form': patch_form,
|
||||
'delete_form': delete_form,
|
||||
'options_form': options_form,
|
||||
|
||||
'raw_data_put_form': raw_data_put_form,
|
||||
'raw_data_post_form': raw_data_post_form,
|
||||
'raw_data_patch_form': raw_data_patch_form,
|
||||
'raw_data_put_or_patch_form': raw_data_put_or_patch_form,
|
||||
|
||||
'api_settings': api_settings
|
||||
})
|
||||
|
||||
context = self.get_context(data, accepted_media_type, renderer_context)
|
||||
context = RequestContext(renderer_context['request'], context)
|
||||
ret = template.render(context)
|
||||
|
||||
# Munge DELETE Response code to allow us to return content
|
||||
# (Do this *after* we've rendered the template so that we include
|
||||
# the normal deletion response code in the output)
|
||||
response = renderer_context['response']
|
||||
if response.status_code == status.HTTP_204_NO_CONTENT:
|
||||
response.status_code = status.HTTP_200_OK
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{% if response.status_code != 403 %}
|
||||
{% if display_edit_forms %}
|
||||
|
||||
{% if post_form or raw_data_post_form %}
|
||||
<div {% if post_form %}class="tabbable"{% endif %}>
|
||||
|
|
Loading…
Reference in New Issue
Block a user