Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Django REST Framework - как заполнить шаблон данными без использования Django моделей?

Как заполнить шаблон без моделей? Использую Django REST, python 3.4, Angular JS
Предположим, есть 4 страницы в виде шаблонов: main.html, page1.html, page2.html, page3.html
На странице main отображается список, который получается из запроса к базе данных. При выборе какого-либо пункта необходимо осуществлять переход на страницу page1, и на ней отображать список, полученный также из результатов выполнения запроса к базе данных (база данных не Django), но уже с учетом выбранного на странице main пункта, т.е. передать несколько параметров в REST, заполнить шаблон page1.html результатами выполнения запроса и отобразить итоговую страницу. Далее при выборе пункта осуществлять аналогично переход на страницу page2, с нее на page3 и т.д.
Просто делать у пунктов ссылки вида /page1/type=sometype&id=1 на странице main, на page1 - /page2/type=secondtype&id=6 и т.д? Какого типа лучше использовать класс для обработки запросов - APIView? Пытаюсь использовать APIView, перехожу по ссылке вида /page1?id=1 Вот пример без type параметра, только с id
class SomeAPI(APIView): permission_classes = [permissions.AllowAny]
def get(self, request, *args, **kwargs): if (request.GET.get('id',None)): ... # result = получаю из базы данных набор записей на основе id return Response({'res':result}, template_name="page1.html")
в urls.py: url(r'^page1'), SomeAPI.as_view()
В шаблоне page1.html
... {{item}} ...
Записи возвращаются верно (т.е. с получением данных из БД проблем нет), но отображаются не в шаблоне page1.html, а на странице стандартного шаблона REST API в виде JSON-структуры
{ "res": [ { "item": "1" }, { "item": "2" }, { "item": "3" }, { "item": "4" } ] }
По сути мне нужно объединить функционал TemplateView + APIView. Можно было бы аналогично, как на странице main, из контроллера AngularJS запрашивать у APIView JSON результат методом GET, и заполнять template. Но для page1, page2, page3 нужно использовать id. Передать запросом GET его не проблема, и сформировать ответ в APIView тоже, но как передать в контроллер для страницы page1 этот id со страницы main, например? И как заполнить на основе JSON-ответа шаблон?


Ответ

Чтобы отправить словарь в шаблон, нужно использовать TemplateHTMLRenderer в параметре renderer_classes,а сам шаблон добавляется в параметр template_name
from rest_framework.renderers import TemplateHTMLRenderer from rest_framework.response import Response from rest_framework.views import APIView
class SomeAPI(APIView): renderer_classes = [TemplateHTMLRenderer] template_name = 'page1.html'
def get(self, request, *args, **kwargs): ... return Response({'res':result})
Документация по работе с шаблонами
Вообще лучше разделить бекенд и фронтенд, роутинг настроить в Angular, а REST использовать только для отправки данных.

Комментариев нет:

Отправить комментарий