Как заполнить шаблон без моделей?
Использую 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
...
Записи возвращаются верно (т.е. с получением данных из БД проблем нет), но отображаются не в шаблоне 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 использовать только для отправки данных.
Комментариев нет:
Отправить комментарий