diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index b6be6b7cc..b1c88d8dd 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -200,6 +200,9 @@ class BasePagination(object): def to_html(self): # pragma: no cover raise NotImplementedError('to_html() must be implemented to display page controls.') + def get_results(self, data): + return data['results'] + class PageNumberPagination(BasePagination): """ diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 6c7cdf537..c439b1f25 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -668,6 +668,43 @@ class BrowsableAPIRenderer(BaseRenderer): return ret +class AdminRenderer(BrowsableAPIRenderer): + template = 'rest_framework/admin.html' + format = 'admin' + + def get_context(self, data, accepted_media_type, renderer_context): + """ + Render the HTML for the browsable API representation. + """ + context = super(AdminRenderer, self).get_context( + data, accepted_media_type, renderer_context + ) + + paginator = getattr(context['view'], 'paginator', None) + try: + results = data if paginator is None else paginator.get_results(data) + except KeyError: + results = data + + if isinstance(results, list): + header = results[0] + style = 'list' + else: + header = results + style = 'detail' + + columns = [key for key in header.keys() if key != 'url'] + details = [key for key in header.keys() if key != 'url'] + linked = [columns[0]] + + context['style'] = style + context['columns'] = columns + context['details'] = details + context['linked'] = linked + context['results'] = results + return context + + class MultiPartRenderer(BaseRenderer): media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' format = 'multipart' diff --git a/rest_framework/templates/rest_framework/admin.html b/rest_framework/templates/rest_framework/admin.html new file mode 100644 index 000000000..eec88f8a9 --- /dev/null +++ b/rest_framework/templates/rest_framework/admin.html @@ -0,0 +1,212 @@ +{% load url from future %} +{% load staticfiles %} +{% load rest_framework %} + + +
+ {% block head %} + + {% block meta %} + + + {% endblock %} + +{{ key|capfirst }} | {{ value }} |
---|
{{ column|capfirst }} | {% endfor %}
---|
+ {% if key in linked %}{% endif %} + {{ value }} + {% if key in linked %}{% endif %} + | + {% endif %} + {% endfor %} +