Html 数据访问:Django表单vs request.POST方法

Html 数据访问:Django表单vs request.POST方法,html,django,post,request,Html,Django,Post,Request,有人能解释一下为什么强烈建议使用Django表单来获取html对象,而不是直接从request.POST或request.get访问吗?简言之:表单使得检索和验证更不容易出错,并且通常会执行许多本来需要的逻辑(很多)样板代码 request.POST(或request.GET)中的项目是通过浏览器发送的,因此您无法保证项目(全部)以预期的格式存在 实际上,request.POST['somefield']可以在POST请求不包含以somefield为键的键值对的情况下引发keyrerror。当然

有人能解释一下为什么强烈建议使用Django表单来获取html对象,而不是直接从request.POST或request.get访问吗?

简言之:表单使得检索和验证更不容易出错,并且通常会执行许多本来需要的逻辑(很多)样板代码

request.POST
(或
request.GET
)中的项目是通过浏览器发送的,因此您无法保证项目(全部)以预期的格式存在

实际上,
request.POST['somefield']
可以在POST请求不包含以
somefield
为键的键值对的情况下引发
keyrerror
。当然,您可以将其包装在一个
try…中,除了…
,但这很容易为一个包含多个项的表单生成大量代码

即使该项出现在
请求.POST
中,它也不是预期格式。例如,如果使用数字字段(
),则需要一个数字。但是可以很容易地“伪造”HTTP请求,其中
somefield
包含
'blabla'
'四十二'
。Django可以验证字段的格式。例如,它将要求值是可选的减号,后跟一系列数字

Django表单还将“清理”这些值。这意味着,如果您使用
整型字段
,然后访问
表单.cleaned_data['somefield']
,则它将不会具有类型a
str
ing,而是
int
。因此,您不必自己显式地进行转换。这意味着您可以立即将两个
IntegerField
s的值相加,例如,如果您自己这样做,则这些值是第一个
str
ing,将它们相加将连接字符串

如果清理或验证以某种方式失败,并且字段包含错误,则
表单
可以解释错误是什么。您可以访问
form.errors
,它是一个类似字典的对象,将字段名称映射到问题列表。它还可以更方便地列出多个错误。例如,如果密码至少应为10个字符,并且包含大写字母,则可以报告这两个问题

还可以使创建和更新对象更加方便。它有一个
.save()
方法。因此,如果包装在数据库中的
.instance
尚未保存,这将在数据库中创建新记录,否则将更新记录。此外,它还将保存
ManyToManyField
s(至少如果您没有设置
commit=False
)。这是一项棘手的任务,因为为了保存多对多关系中的对象,首先需要在数据库端创建对象


最后,您还可以使用表单在HTML端轻松呈现它。有像这样的Django应用程序可以给表单另一种外观。因此,它可以方便地呈现表单,如果您改变主意,也可以轻松地更改外观。

因为Django表单可以执行验证,将其转换为字段类型(例如,
int
),删除样板代码以保存到对象和多对多字段,上载文件等。换句话说,在Django表单中,您可以编辑对象?这是否回答了您的问题@fjplaurr:我认为这些不一样。一个
request.POST
(或
request.GET
)来回传表单,它始终是一个HTML表单。您可以决定手动处理请求(这是不可取的),或者使用Django表单,但Django表单与HTML表单没有太多关系,只是它可以在模板中呈现一个表单。