数据访问:Django 表单与 request.POST 方法 [关闭]

Posted

技术标签:

【中文标题】数据访问:Django 表单与 request.POST 方法 [关闭]【英文标题】:Data accessing : Django forms vs request.POST method [closed] 【发布时间】:2021-03-03 04:26:05 【问题描述】:

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

【问题讨论】:

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

简而言之:表单使检索和验证更不容易出错,并且通常会执行大量逻辑,否则需要(大量)样板代码。

request.POST(或request.GET)中的项目是由浏览器发送的,因此您无法保证这些项目将(全部)存在,并且采用预期的格式。

确实,request.POST['somefield'] 可以引发 KeyError,以防 POST 请求不包含以 somefield 为键的键值对。当然,您可以将其包装在 try … except … 中,但这很容易为包含多个项目的表单生成大量代码。

即使该项目存在于request.POST 中,它也不是按预期格式显示的。例如,如果您使用数字字段 (<input name="somefield" type="number">),则需要一个数字。但是可以轻松地“伪造”一个 HTTP 请求,其中 somefield 包含 'blabla''forty-two' 代替。 Django 可以验证字段的格式。例如,对于IntegerField [Django-doc],它将要求该值是可选的减号,后跟一系列数字。

Django 表单也会“清理”这些值。这意味着如果您使用IntegerField,然后您访问form.cleaned_data['somefield'],则它的类型将不是string,而是int。因此,您不必显式地自己进行转换。这意味着您可以立即将两个 IntegerFields 的值加在一起,而如果您自己做,则首先是 strings,然后将它们加在一起将连接字符串。

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

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

最后,您还可以使用表单在 HTML 端轻松地呈现它。有像 django-crispy-forms [GitHub] 这样的 Django 应用程序可以让表单焕然一新。因此,它可以方便地呈现表单,如果您改变主意,也可以轻松更改外观。

【讨论】:

以上是关于数据访问:Django 表单与 request.POST 方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

开始页面上的 Django 注册表单,没有重定向到登录页面

在 Meta,Django Floppyforms 中访问表单变量

django 表单

Django - 获取表单数据的三种方式

Python Web框架篇:Django Form组件

Django 表单验证:在父表单中获取子表单数据