【发布时间】:2017-01-05 06:09:06
【问题描述】:
ViewSets 做我想做的一切,但我发现如果我想将额外的上下文传递给模板(使用 TemplateHTMLRenderer),那么我将不得不使用给出响应的函数..(如 list(),创建()等)
我能看到进入这些的唯一方法是在我的 ViewSet 中完全重新定义它们,但似乎应该有一种简单的方法可以向模板添加一些上下文,而不必重新定义一整套方法...
class LanguageViewSet(viewsets.ModelViewSet):
"""Viewset for Language objects, use the proper HTTP methods to modify them"""
# TODO: add permissions for this view?
queryset = Language.objects.all()
serializer_class = LanguageSerializer
filter_backends = (filters.DjangoFilterBackend, )
filter_fields = ('name', 'active')
现在我的代码看起来像这样,但我想为响应添加不同的上下文,并且我试图避免为如此小的更改重新定义整个方法。像这样……
class LanguageViewSet(viewsets.ModelViewSet):
"""Viewset for Language objects, use the proper HTTP methods to modify them"""
# TODO: add permissions for this view?
queryset = Language.objects.all()
serializer_class = LanguageSerializer
filter_backends = (filters.DjangoFilterBackend, )
filter_fields = ('name', 'active')
def list(self, **kwargs):
"""Redefinition of list"""
..blah blah everything that list does
return Response({"foo": "bar"}, template_name="index.html")
【问题讨论】:
-
你做错了,DRF API 中没有(不应该)模板。上下文被传递给序列化器,然后序列化器数据进入一个渲染器,该渲染器检查请求上的
Accept标头以定义如何渲染数据:json、csv 甚至 HTML -
所以从我收集的信息来看,API 应该只是获取数据并按照 DRF 的方式处理它。然后我应该使用另一个带有视图和表单等的应用程序将数据发送到 API实现我想要实现的目标?
-
@pleasedontbelong 我已经完成了该教程和长篇教程,并通读了大部分文档。不过,我仍然没有更接近我的问题的答案。如果 DRF 中不应该有模板,那么为什么它们包含
TemplateHTMLRenderer以及在响应中传递额外上下文的方法? django-rest-framework.org/topics/html-and-forms -
我不同意。 ViewSet 的工作是返回原生 python 数据类型。然后渲染器的工作就是将它渲染成任何需要的方式。 JSON 或 HTML。在很多情况下 REST API 需要在 HTML 模板中返回数据。
标签: python django django-rest-framework