0

如果没有另外指定,我正在尝试创建一个返回常规 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
4

1 回答 1

1

渲染多个上下文项的问题是您无法在模板中访问它们的键。你需要稍微破解一下。

我已经回答了一个相关的 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')
于 2013-11-11T13:00:01.093 回答