8

私は Django Rest Framework を持っており、 HTML を表示ModelViewSetするために使用しようとしています。チュートリアルTemplateHTMLRendererに従ってください:

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()と、テンプレートに渡されたモデル オブジェクトにアクセスできます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

だから私は何か簡単なものを見逃しているか、これがどのように動作することを期待しているかは、著者が意図したものではありませんか?

4

4 に答える 4

14

私はこのように行きます:

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テーブル(または使用する接尾辞)を取得するために使用します。

この方法では、レンダー タイプごとにリゾルバーをオーバーライドしません。

他の解決策は、リスト アクション専用のビューを作成し、HTML レンダラーのみを使用することです。ただし、コードの重複がわずかに発生します。

于 2013-09-20T23:33:14.377 に答える
0

テンプレート コンテキストを提供するメソッドをサブクラス化してオーバーライドし、テンプレート コンテキストdata内でシリアライザー データを使用できるようにしました。

from rest_framework.renderers import TemplateHTMLRenderer


class MyHTMLRenderer(TemplateHTMLRenderer):
    def get_template_context(self, data, renderer_context):
        context = {'data': data}
        response = renderer_context['response']
        if response.exception:
            data['status_code'] = response.status_code
        return context
于 2016-10-30T04:07:41.397 に答える