2015-04-20 3 views
1

Я пытаюсь сделать что-то очень простое, но пока не нашел, как это сделать.Включите JSON из Django Rest Framework в HTML-шаблоне

У меня есть модель и конечная точка, возвращающая массив JSON, ретранслирующий экземпляры этой модели с Django Rest Framework. Я хочу включить JSON в HTML-шаблон (для SEO и для быстрой начальной загрузки данных). Что-то вроде

<script> 
    var data = {% json_from_django_rest_framework "mymodel" %}; 
</script> 

Есть ли простой способ сделать это? Должен ли я просто пойти по-другому?

+0

Как вы хотите визуализировать/создавать этот шаблон? Очевидно, конечная точка DRF предоставит вам некоторые данные (в данном случае в JSON). Чтобы статически отобразить этот JSON на сервере, вы можете создать обычное представление Django, которое будет предоставлять ваш шаблон. Из этой точки зрения вы можете запросить данные с конечной точки DRF. Я предполагаю, что позже какой-нибудь Javascript на интерфейсе возьмет контроль над вашим webapp, и именно поэтому вам нужен REST API в первую очередь? – sthzg

+0

Да, я могу сериализовать JSON в python в представлении. Я прыгал, был более простой способ сделать это в шаблоне напрямую. В самом деле, позже javascript сделает дальнейшие запросы к конечной точке REST. – Rems

+0

Является ли ваша цель избегать дополнительного представления вообще или просто для того, чтобы не создавать тот же вывод, который конечная точка DRF уже предоставляет в этом дополнительном представлении? В последнем случае вы можете использовать помощник Django ['resolve'] (https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#resolve) для повторного использования JSON-вывода из DRF в вашем представлении и, таким образом, все еще держите его СУХОЙ. (Я мог бы привести пример) – sthzg

ответ

2

Как описано в комментариях, приведен пример повторного использования результата из конечной точки api в обычном представлении Django с помощью функции Django resolve.

views.py

import json 
from django.core.urlresolvers import resolve 
from django.views.generic.base import View  

class FooView(View): 
    def get(self, request): 
     # optional stuff in your view... 

     ## 
     # Resolving another Django view programmatically 
     ## 
     rev = '/path/to/api/endpoint/' # or use reverse() 
     view, vargs, vkwargs = resolve(rev) 
     vkwargs['request'] = request 
     res = view(*vargs, **vkwargs) 

     c = Context({ 
      'data': json.dumps(res.data) 
     }) 

     # Now the JSON serialized result from the API endpoint 
     # will be available in the template variable data. 
     return render(request, 'my-app/my-template.html', c) 

мой-template.html

<script> 
    var data = {{ data }}; 
</script> 

Примечание 1: Вместо жесткого кодирования путь в rev = '/path/to/api/endpoint/' лучше reverse() URL-адрес, но я оставил его, чтобы удалить это как источник ошибок. Если вы собираетесь в этом направлении, здесь a list имен URL-адрес по умолчанию, предоставленных ФПИ

Примечание 2: Сниппет выиграют от обработки исключений, как убедитесь, что res возвращается 200, имеет data собственности и т.д.

2

Другой способ сделать это, что происходит вокруг визуализации представления.

На ваших view.py;

class FooDetailView(DetailView): 
    model = Foo 
    template_name = 'foo/detail.html' 

    def get_context_data(self, **kwargs): 
     bars = [] 
     for bar in self.object.bars.all(): 
      bars.append(BarSerializer(bar).data) 

     kwargs['bars'] = JSONRenderer().render(bars) 

     return super(FooDetailView, self).get_context_data(**kwargs) 

И в вашем шаблоне;

<script> 
    var bars = {{ bars|safe }}; 
</script> 

Он должен действительно пойти, не говоря, что вы должны обратить внимание на потенциальные проблемы с производительностью при таком подходе, то есть .. возможно, лучше постраничной bars.

Смежные вопросы