在 HTML 模板中包含来自 Django Rest Framework 的 JSON

Include JSON from Django Rest Framework in an HTML template

我正在尝试做一些非常简单的事情,但还没有找到如何去做。

我有一个模型和一个返回 JSON 数组的端点,用 Django Rest Framework 表示这个模型的实例。我想在 HTML 模板中包含 JSON(用于 SEO 和快速初始数据加载)。像

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

有没有简单的方法来做到这一点?我应该换个方式吗?

正如评论中所讨论的,这里有一个示例,说明如何使用 Django 的 resolve 函数在普通 Django 视图中重用 api 端点的结果。

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() the url, but I left it out to remove that as a source for errors. If you are going this direction, here is a list DRF 提供的默认 url 名称

注意 2: 该代码段将从异常处理中受益,例如确保 res 返回 200,具有 data 属性等

另一种方法,绕过渲染视图。

在你的 views.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