Django Rest 框架表单

sko*_*per 5 django django-rest-framework

我想做的事:

Django Rest Framework 附带一个渲染器,用于从序列化器返回 HTML 表单[1]。在仔细阅读文档和代码之后,我仍然无法弄清楚如何让它呈现空白表单。

我认为问题可能在于:

我不知道如何实例化空白序列化器。在 DRF 的文档中,他们说序列化器具有与 django 表单非常相似的 API。当您想要在模板中使用空白表单时,可以使用 MyForm() 实例化一个表单并将其传递到模板上下文。但是,当我尝试使用序列化器时,.data 属性只是{'detail': 'Not Found.'}

请帮忙

我觉得我一定错过了一些非常明显的东西,因为渲染空白表单似乎是 HTMLFormRenderer 的一个非常重要的用例。

一些源代码

class CustomViewSet(ModelViewSet):
    lookup_field = 'id'
    pagination_class = MyCustomPagination
    serializer_class = MyModelSerializer
    renderer_classes = (JSONRenderer, BrowsableAPIRenderer, HTMLFormRenderer)

    def create(self, request, *args, **kwargs):
        # return an html form for GET requests to /api/my_model/create/.form
Run Code Online (Sandbox Code Playgroud)

我很确定我已经将 urlconf 连接正确,请求最终出现在正确的位置,因为当我 GET 时,/api/my_model/<pk>/.form我会收到一个表单作为响应,并预先输入模型属性。我只是想要一种获得空白表格的方法......

sko*_*per 2

我设法在我的视图集上使用以下方法返回表单的 html 片段:

class CustomViewSet(ModelViewSet):

    @list_route()
    def form(self, request, *args, **kwargs):
        serializer = self.get_serializer()
        renderer = HTMLFormRenderer()
        form_html = renderer.render(serializer.data, renderer_context={
            'template': 'rest_framework/api_form.html',
            'request': request
        })
        return HttpResponse(form_html)
Run Code Online (Sandbox Code Playgroud)

我需要使用普通的 django HttpResponse,而不是休息框架的 Response 对象,以防止 Response 对象尝试使用视图集的默认渲染器重新渲染 form_html。另外,需要list_route装饰器来获取rest_framework的DefaultRouter来添加端点my_model/form/,这并不意味着视图必须返回列表。