使用DRF ModelViewSet和TemplateHTMLRenderer时,如何访问模板中的数据?

Sco*_*all 8 django django-rest-framework

我有一个Django Rest Framework ModelViewSet,我正在尝试使用它TemplateHTMLRenderer来显示HTML.继续在教程中:

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
Run Code Online (Sandbox Code Playgroud)

如果我添加一个键,def resolve_context()我可以访问模板中传递给的模型对象RequestContext.如果我不添加data密钥,那么我不知道如何访问代码片段.

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
Run Code Online (Sandbox Code Playgroud)

所以我必须要错过一些简单的东西,或者我期望这样做是不是作者的意图?

mar*_*dev 12

我会这样走:

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
Run Code Online (Sandbox Code Playgroud)

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

这样,您不会为每种渲染类型覆盖解析器.

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