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