如何通过编程方式在一个视图中调用Django Rest Framework视图?

vfh0ocws  于 2022-11-18  发布在  Go
关注(0)|答案(5)|浏览(185)

我用Django Rest框架(DRF)构建了以下基于类的通用视图

class ExampleDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer
    renderer_classes = (JSONRenderer, TemplateHTMLRenderer)

    def get(self, request, *args, **kwargs):

        response = self.retrieve(request, *args, **kwargs)
        if request.accepted_renderer.format == 'html':
            form = ExampleForm(data=response.data)
            return Response({'data': response.data, 'form': form}, template_name='example.html')

        return response

这个视图允许我通过指定format=json或html从同一个端点获取JSON数据或HTML表单。

我希望以编程方式调用该视图以从另一个视图中获取呈现的HTML表单,以便将此表单包含在将包含更多内容的另一个页面中。

sirbozc5

sirbozc51#

我在文档中找到了解决方案... https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins/
这里的提示是从他们的例子中得来的:

class AuthorDetail(View):

    def get(self, request, *args, **kwargs):
        view = AuthorDisplay.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = AuthorInterest.as_view()
        return view(request, *args, **kwargs)
hl0ma9xz

hl0ma9xz2#

html_from_view = ExampleDetail.as_view({'get': 'list'})(request).content

html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content
w8f9ii69

w8f9ii693#

从Django 2.2和DRF 3.9.2开始,我可以使用下面的代码得到响应。

response = UserItemsApiView.as_view()(request=request._request).data

以上示例解决了以下问题:

  • request参数必须是django.http.HttpRequest的示例,而不是rest_framework.request.Request
  • 使用data属性而不是content,可以从该视图获得结果。
pkbketx9

pkbketx94#

一些答案的语法让我感到困惑,尽管Django文档是这样解释的:
https://docs.djangoproject.com/en/4.1/ref/class-based-views/base/#django.views.generic.base.View.as_view
我的小脑袋瓜比较容易理解这个问题:

class MyTemplateView(TemplateView):
    template_name = 'my_template.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        view = MyApiView.as_view()
        response = view(request=self.request)
        data = response.data
        context["somedata"] = data
        return context
vh0rcniy

vh0rcniy5#

如果我没理解错的话,你需要从视图B中得到结果,而视图A内部。
使用requests/urllib 2json库应该可以解决您的问题(如this answer中所指定)。
要获取URL,可以使用 request.get_absolute_uri() 和/或 request.get_host()django.core.urlresolvers.reverse 的组合。

相关问题