如何通过django的rest_framework传递上下文

时间:2013-11-11 12:04:02

标签: python django response httpresponse django-rest-framework

我正在尝试创建一个视图,如果没有另外指定,则返回常规的html响应。我正在使用django的rest_framework来根据请求返回JSON。

除了我想在模板中访问我的上下文的部分外,一切正常。

这是基于图片的小代码示例:

@api_view(('GET', ))
@renderer_classes((TemplateHTMLRenderer, UnicodeJSONRenderer, JSONRenderer, BrowsableAPIRenderer))
def index(request):
    queryset = Picture.objects.all()

    page = request.GET.get('page')
    paginator = Paginator(queryset, 25)
    try:
        pictures = paginator.page(page)
    except PageNotAnInteger:
        pictures = paginator.page(1)
    except EmptyPage:
        pictures = paginator.page(paginator.num_pages)

    serializer_context = {'request': request, 'pictures': pictures, 'filter': FilterForm()}
    serializer = PaginatedPictureSerializer(pictures, context=serializer_context)
    return Response(serializer.data, template_name='index.html')

当我想在模板中访问我的上下文时新建:

{% if pictures %}
      {% for picture in pictures %}
          ...
      {% endfor %}
{% else %}
    <p>No pictures are available.</p>
{% endif %}

结果总是:没有图片可用(并且说明同样的说法)。

修改 按要求

class PictureSerializer(serializers.ModelSerializer):

    class Meta:
        model = Picture


class PaginatedPictureSerializer(pagination.PaginationSerializer):

    class Meta:
        object_serializer_class = PictureSerializer

1 个答案:

答案 0 :(得分:1)

呈现多个上下文项的问题是您无法访问模板内的键。你需要对它进行一点点破解。

我已经回答了relevant SO question,这解决了这个问题。所以基本上你做了:

serializer_context = {'request': request, 'pictures': pictures, 'filter': FilterForm()}

if request.accepted_renderer.format == 'html':
    return Response(serializer_context, template_name='index.html')

serializer = PaginatedPictureSerializer(pictures, context=serializer_context)
return Response(serializer.data, template_name='index.html')