在 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
。
我正在尝试做一些非常简单的事情,但还没有找到如何去做。
我有一个模型和一个返回 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
。