mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-09 08:00:52 +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
|
* `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:
|
||||||
* `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,6 +564,49 @@ class BrowsableAPIRenderer(BaseRenderer):
|
||||||
def get_breadcrumbs(self, request):
|
def get_breadcrumbs(self, request):
|
||||||
return get_breadcrumbs(request.path)
|
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):
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
||||||
"""
|
"""
|
||||||
Render the HTML for the browsable API representation.
|
Render the HTML for the browsable API representation.
|
||||||
|
@ -571,60 +614,15 @@ class BrowsableAPIRenderer(BaseRenderer):
|
||||||
self.accepted_media_type = accepted_media_type or ''
|
self.accepted_media_type = accepted_media_type or ''
|
||||||
self.renderer_context = renderer_context 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)
|
template = loader.get_template(self.template)
|
||||||
context = RequestContext(request, {
|
context = self.get_context(data, accepted_media_type, renderer_context)
|
||||||
'content': content,
|
context = RequestContext(renderer_context['request'], context)
|
||||||
'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
|
|
||||||
})
|
|
||||||
|
|
||||||
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 @@
|
||||||
</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 %}>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user