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

Eti*_*gné 34 django django-rest-framework

我有使用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
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*ser 28

我在文档中找到了解决方案... https://docs.djangoproject.com/en/1.7/topics/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)
Run Code Online (Sandbox Code Playgroud)

  • 不行.我得到````request`参数必须是`django.http.HttpRequest`的一个实例,而不是'rest_framework.request.Request```` (6认同)
  • 似乎有人(Greg Brown)提出了一项修改,即这些调用应为“返回视图(request view_request,* args,** kwargs)”-也许这是“更新”的方式,@ waqasgard ...我认为值得尝试。答案保持原样,因为它与链接的文档匹配,并且对于较早版本的Django有效。 (3认同)

Eti*_*gné 21

html_from_view = ExampleDetail.as_view({'get': 'list'})(request).content
Run Code Online (Sandbox Code Playgroud)

要么

html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content
Run Code Online (Sandbox Code Playgroud)

  • 5 年后,上面的代码现在有效,除了使用 `request._request` 而不是 `request`。 (3认同)
  • 此解决方案适用于 ViewSet,但不适用于 APIView。下面 JD Solanki 提供的解决方案适用于 APIView。 (2认同)

JD *_*nki 13

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

response = UserItemsApiView.as_view()(request=request._request).data
Run Code Online (Sandbox Code Playgroud)

上面的例子解决了以下问题:

  • request参数必须是实例django.http.HttpRequest,不rest_framework.request.Request
  • 而不是content,使用data属性从该视图中给了我结果。

  • 我尝试此操作时收到“b'{”detail”:“CSRF 失败:CSRF 令牌丢失或不正确。”}'“,知道为什么吗? (3认同)