使用DRF ModelViewSet和TemplateHTMLRenderer时如何访问模板中的数据? [英] How do you access data in the template when using DRF ModelViewSet and TemplateHTMLRenderer?

查看:1306
本文介绍了使用DRF ModelViewSet和TemplateHTMLRenderer时如何访问模板中的数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Django Rest框架 ModelViewSet ,并尝试使用 TemplateHTMLRenderer 来显示HTML。遵循教程

I've got a Django Rest Framework ModelViewSet and am trying to use the TemplateHTMLRenderer to display HTML. Following along in the tutorial:

from rest_framework import permissions, renderers, viewsets
from rest_framework.decorators import link

from . import models, serializers
from .permissions import IsOwnerOrReadOnly


class SnippetViewSet(viewsets.ModelViewSet):
    template_name = 'snippet-list.html'
    queryset = models.Snippet.objects.all()
    serializer_class = serializers.SnippetSerializer
    renderer_classes = (renderers.TemplateHTMLRenderer,)
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

    @link(renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

    def pre_save(self, obj):
        obj.owner = self.request.user

如果我在def resolve_context() 我可以访问模型ob我的模板中的对象被传递到 RequestContext 中。如果我不添加数据密钥,那么我不知道如何访问该片段。

If I add a key in def resolve_context() I can access the model objects in my template that are passed into the RequestContext. If I don't add the data key then I don't know how to access the Snippets.

def resolve_context(self, data, request, response):
    if response.exception:
        data['status_code'] = response.status_code

    #return RequestContext(request, data)  # original source on github
    return RequestContext(request, {'data': data})  # if I add a key I can access it

所以我必须遗漏一些简单的东西,或者我期待这样做是不是作者的意图?

So I've got to be missing something easy or how I'm expecting this to behave is not how the authors intended?

推荐答案

我会这样走:

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    renderer_classes = (renderers.JSONRenderer, renderers.TemplateHTMLRenderer)

    def list(self, request, *args, **kwargs):
        response = super(SnippetViewSet, self).list(request, *args, **kwargs)
        if request.accepted_renderer.format == 'html':
            return Response({'data': response.data}, template_name='home.html')
        return response

并使用 http://127.0.0.1:8000/snippets/.html 获取表(或您使用的任何后缀)。

and use http://127.0.0.1:8000/snippets/.html to get table (or whatever suffix you use).

这样你不要为每个渲染类型覆盖解析器。

This way you don't override resolver for each render type.

其他解决方案将是创建列表操作的专用视图,并且仅使用HTML渲染器。但是那么你会有一个小的代码重复。

Other solution would be to just create dedicated view for list action and only use HTML renderer. But then you would have a small code duplication.

这篇关于使用DRF ModelViewSet和TemplateHTMLRenderer时如何访问模板中的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆