【问题标题】:How to pass a context through django's rest_framework如何通过 django rest 框架传递上下文
【发布时间】:2013-11-11 12:04:01
【问题描述】:

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

【问题讨论】:

  • 请告诉我们PaginatedPictureSerializer的定义。
  • @mariodev 给你,普通的书架(或者更确切地说是 doc)类。

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


【解决方案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')

【讨论】:

  • 谢谢,成功了!我不得不说这很愚蠢。它真的应该自己做。
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 2013-12-26
  • 2016-10-25
  • 2016-02-16
  • 2021-09-27
  • 2017-02-19
  • 2021-04-11
  • 2013-10-25
相关资源
最近更新 更多