Django Rest框架表单 我想做的是:

Django Rest框架表单 我想做的是:,django,django-rest-framework,Django,Django Rest Framework,Django Rest框架附带一个渲染器,用于从序列化程序返回HTML表单。在仔细阅读了文档和代码之后,我仍然不知道如何让它呈现一个空白表单 我认为问题可能是: 我不知道如何实例化空白序列化程序。在DRF的文档中,他们说序列化程序的API与django的表单非常相似。当您希望在模板中使用空白表单时,可以使用MyForm()实例化一个表单,并将其传递给模板上下文。但是,当我尝试使用序列化程序时,.data属性只是{'detail':'notfound.} 请帮忙 我觉得我肯定错过了一些显而易见的东

Django Rest框架附带一个渲染器,用于从序列化程序返回HTML表单。在仔细阅读了文档和代码之后,我仍然不知道如何让它呈现一个空白表单

我认为问题可能是: 我不知道如何实例化空白序列化程序。在DRF的文档中,他们说序列化程序的API与django的表单非常相似。当您希望在模板中使用空白表单时,可以使用MyForm()实例化一个表单,并将其传递给模板上下文。但是,当我尝试使用序列化程序时,.data属性只是
{'detail':'notfound.}

请帮忙 我觉得我肯定错过了一些显而易见的东西,因为呈现空白表单似乎是HTMLFormRenderer的主要用例

一些源代码
我非常确定我正确地连接了urlconf,请求最终到达了正确的位置,因为当我得到
/api/my_model//.form
时,我得到了一个表单作为响应,其中预先输入了模型属性。我只是想找个办法得到一张空白表格

序列化程序必须声明至少一个字段才能使用它

要创建一个完全空白的序列化程序,只需添加一个自定义SerializerMethodField(返回None)或一个接受空值的隐藏字段:

class EmptySerialiser(serializers.Serializer):
    empty = serializers.SerializerMethodField()

    def get_empty(self):
        return None

我不知道如何实例化空白序列化程序

DRF允许您在没有数据和实例连接的情况下初始化序列化程序。因此,在您的情况下,视图代码如下所示

serializer = self.get_serializer()
我觉得我肯定错过了一些显而易见的东西,因为呈现空白表单似乎是HTMLFormRenderer的主要用例

从那时起,
serializer
应该包含呈现表单所需的所有信息。如果您想在Django REST框架呈现默认表单时使用它们,可以使用它们提供的默认表单

serializer = self.get_serializer()
renderer = HTMLFormRenderer()
form_html = renderer.render(serializer.data)

需要注意的是,
HTMLFormRenderer
不受标准弃用政策的约束。因此,如果您确实使用它,请确保在升级时严格遵循任何发行说明,以确保不会意外中断。

我在视图集中使用以下方法为表单返回了一个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)

我需要使用普通的django HttpResponse,而不是rest框架的响应对象,以防止响应对象尝试使用viewset的默认呈现器重新呈现表单html。另外,需要使用列表路由装饰器来让rest框架的DefaultRouter添加
my\u model/form/
端点,这并不意味着视图必须返回列表。

感谢您的回答!不过,对不起,我不是这个意思。为了澄清,我有一个带有多个字段的ModelSerializer,我想在没有实例或数据的情况下初始化它,以便生成一个空白表单。我将在我的OP中添加一些源代码来演示我的意思。谢谢Kevin。这应该是正确的,我会将其标记为正确的,但显然HTMLFormRenderer还没有像文档中那样工作,并且在其他渲染器(例如BrowsableapInderer)之外不可用。编写时,renderer.render将抛出错误,因为serializer.data只是
{'detail':'notfound'}
。我曾试图模仿BrowsableapInderer的实现,从HTMLFormRenderer中哄骗出一个html部分,但老实说,代码让我陷入了困境。如果您感兴趣,请参阅了解更多详细信息。我错了,这不是失败的地方,我得到的是404,因为路由器没有添加.form端点,除非您将HTMLFormRenderer放入viewset渲染器类中。因此,我不再试图重载
/create/
端点,而是添加了一个额外的
/form/
端点。但是,我仍然需要显式地将模板名称和请求传递给renderer.render,以使其正常工作。我现在有工作代码,我会把它发布在一个答案中,以防它对你或将来的任何访问者有所帮助。答案发布。谢谢你的帮助,你可以看到答案主要是从你的灵感。
serializer = self.get_serializer()
renderer = HTMLFormRenderer()
form_html = renderer.render(serializer.data)
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)