此文档提供基本的web表单介绍和Django中如何处理表单。关于更多的具体细节,能够查阅更多详细文档。
除非你计划构建的网站和应用不发布任何内容,不接受用户输入的数据,不然你须要理解和使用表单。
Django提供一些工具和库帮助你建立表单接收用户的输入,并处理和返回数据。html
在HTML中,表单在<form>..</form>
里面收集用户的输入,例如一段文本,选择按钮等,而后发送输入的信息到服务端。
一些表单接口元素,例如文本输入、复选框都很是的简单而且是HTML内置的,其余的要复杂不少好比界面弹出日期选择器、滑动滑块,操纵这些特效一般会使用JavaScript和 CSS来实现。
关于<input>
元素,一个表单必须指定两件事:程序员
一个例子,Django的Admin中有一个登录表单,包含几个<input>
元素,type="text"
对应username
,type="password"
对应password
,type="submit"
对应登陆按钮,还包含一些对用户隐藏的文本字段,令Django决定接下来要干什么。web
GET和POST是处理表单过程当中惟一使用的HTML方法
Django的login表单使用POST方法,在浏览器中打包表单数据,编码传输,将其发送给服务器,而后接收返回的响应。
对比GET,绑定提交的数据到字符串生成URL,在URL中包含数据必须发送的地址以及数据的键和值,若是你在文档中搜索能够在功能中看见,将会为表单生成这样的URL:
https://docs.djangoproject.com/search/?q=forms&release=1.
GET和POST一般用于不一样目的
一个请求若是用来改变系统的状态,例如:一个请求改变了数据库,应该使用POST,GET应该在不会改变系统状态的状况下使用。
GET不适合用于密码表单,由于密码会出如今URL里,所以,在浏览器的历史记录和服务器日志的纯文本中会出现密码。它也不能适用于大量的数据,相似图片的二进制数据。一个web应用使用GET请求管理员表单会带来安全风险,攻击者会很容易的模仿表单请求获取系统敏感信息,POST结合其余的保护措施,提供更多的访问控制,例如:CSRF protection
在其余方面,GET适合web搜索表单,由于这个URL的GET请求能够方便的存为书签、共享、提交。数据库
处理表单是一项复杂的业务,考虑Django管理员,众多的数据和几个不一样的数据类型须要显示在表单里,渲染到HTML,使用方便的界面编辑,返回到服务器,验证和清理,保存或进一步的加工处理。django
Django表单函数可使绝大部分的工做简单化、自动化,而且比大多数程序员本身写的代码要安全。浏览器
Django处理3个不一样的表单部分:安全
你可能想手动的完成这些功能,可是Django能够帮你完成这些。服务器
咱们简要的描述HTML表单,可是HTML<form>
只是一部分机械的要求。函数
在web应用程序的上下文,form多是指HTML<form>
,或Djangoform
类实例,或结构化数据提交时返回,或这些部位的端到端的集合。工具
这个系统组件的核心是Djangoform
类,在Django模型中描述了类似的逻辑结构对象,它的行为,form
类描述表单如何工做和建立。
使用与model
类类似的字段映射数据库方式,form
类字段映射HTML表单<input>
元素。
表单的字段是类自己,它们管理表单数据, 提交的时候执行验证。DateField和FileField处理不一样的数据,用它们作不一样的事情。
一个表单字段表明一个用户在浏览器中的widget(窗口部件)--用户界面的机制,每一个字段类型有一个默认的Widget class,可是它们能够按要求重写。
在Django渲染一个对象,咱们通常:
1.在视图(view)中抓住它(从数据库中取出)
2.传送它到模版文件
3.扩大到使用模版变量的HTML标签
在模版中渲染一个表单与渲染其余对象很类似,可是有些键值不同。
模型实例中不包含数据,且几乎不多在模版中作任何有用的事情,另外一方面,它塑造一种完美的感受渲染一个未填充的表单,咱们想要用户填充它,这就是咱们想要的。
当咱们在view中处理一个模型实例,咱们一般在数据库中检索,当咱们处理一个表单咱们一般在view中实例化它。
当咱们实例化一个表单,咱们能够选择让它空着或者预填充,例如:
剩下的这些案例都是很是有趣的,它让用户不仅是阅读网页,发送信息与网站交互。
须要完成的工做
假设在你的网站上建立一个简单的表单,获取用户的名字,你须要在模版(tempalte)中添加如下代码:
<form action="/your-name/" method="post"> <label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" value="{{ current_name }}"> <input type="submit" value="OK"> </form>
这些告诉浏览器返回表单数据到URL/your-name/,使用POST方法,它会显示一个文本框,标记为“your_name”,和一个按钮标记为“ok”,若是模版上下文包含一个current_name变量,将会预填充your_name字段。
你须要在view中渲染包含HTML表单的模版,而且能够适当的绑定current_name字段
当表单提交以后,POST请求发送到服务器将包含表单数据。
如今你须要在view中处理相应的 /your-name/ URL映射,将会在请求发现相应的键/值对应,而后处理他们。
这是一个很是简单的表单,在实践中,一个表单可能包含几十个甚至几百个字段,这些可能须要预填充,咱们可能期待用户在最后提交以前,分红几个周期编辑提交数据。
咱们可能须要一些验证在浏览器中出现,即便在表单提交。咱们可能想要使用一些复杂的字段,容许用户从日历选择日期等。