除非你计划构建的网站和应用只是发布内容而不接受访问者的输入,否则你将需要理解并使用表单
HTML 表单:
在HTML中,表单的作用是收集标签中的内容,<form>...</form> 中间可以由访问者添加类似于文本,选择,
或者一些控制模块等等,然后 这些内容将会被送到服务端。
node2:/django/mysite/news/templates#cat index.html
<html>
<head>
<title>Index</title>
<link rel='stylesheet' type='text/css' href='/static/news/Css/Index/index.css'/>
</head>
<body>
<h1>布丁运维管理平台</h1>
<!--图片标签-->
<img class="img_bk" src="/static/news/scan.jpg"/>
<!--表单提交-->
<form action="/main/" method="post" >
<table cellspacing="0" cellpadding="0">
<tr>
<td class="td1">用户名:</td>
<td><input type="text" name="username"/></td>
<td class="td3"></td>
<td class="td4"></td>
<tr/>
<tr>
<td class="td1">密码:</td>
<td><input type="password" name="password"/></td>
<td class="td3"></td>
<td class="td4"></td>
<tr/>
<!-- <tr> -->
<!-- <td class="td1">验证码:</td> -->
<!-- <td> <input type='text' name='code' /></td> -->
<!-- <td class="td3"><img src="__APP__/Public/code" οnclick='this.src=this.src+"?"+Math.random()'/></td> -->
<!-- <td class="td4"></td> -->
<!-- </tr> -->
<tr>
<td class="td1"></td>
<td><input type="submit" value="" name="imgLogin" /></td>
<td class="td3"></td>
<td class="td4"></td>
</tr>
</table>
</form>
</body>
</html>
与<input> 元素一样,一个表单必须指定两样东西:
1.目的地:响应用户输入数据的URL
2.方式:发送数据的HTTP方法
例如:Django Admin 站点的登陆表单包含几个<input> 元素:
type="text" 用于用户名,type="password" 用于密码,type="submit" 用于“Log in" 按钮。它还包含一些用户看不到的隐藏的文本字段,Django 使用它们来决定下一步的行为。
它还告诉浏览器表单数据应该发往<form> 的action 属性指定的URL —— /admin/,而且应该使用method 属性指定的HTTP 方法 —— post。
当触发<input type="submit" value="Log in"> 元素时,数据将发送给/admin/。
GET和POST:
处理表单时只会用到GET和POST 方法:
Django 的登陆表单使用POST方法,在这个方法中浏览器组合表单数据,
对它们进行编码以用于传输,将它们发送到服务器然后接收它的响应。
相反,GET组合提交的数据为一个字符串,然后使用它来生成一个URL。
Django 在表单中的角色
处理表单是一件很复杂的事情,考虑一下Django的Admin站点,不同类型的大量数据项需要在一个表单中准备好,
渲染成HTML,使用一个方便的界面编辑,返回服务器,验证并清除,然后保存或者向后继续处理。
Django 中的表单:
我们已经简短的讲述HTML表单,但是HTML的<form> 只是其机制的一部分。
在一个web应用中,"表单"可能指HTML <form>、或者生成它的Django 的Form、或者提交时发送的结构化数据、或者这些部分的总和。
构建一个表单:
需要完成的工作:
假设你想在你的网站上创建一个简单的表单,以获得用户的名字,你需要这样的模板:
<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’按钮。
你将需要一个视图来渲染这个包含HTML表单的模板,并提供合适的current_name 字段
当表单提交时,发往服务器的POST 请求将包含表单数据。
现在你还需要一个对应/your-name/ URL的视图,它在请求中找到正确的键/值对,然后处理它们。
这是一个非常简单的表单,实际应用中,一个表单可能包含几十上百个字段,其中大部分需要预填充,
而且我们预料到用户景来会编辑
在Django中构建一个表单:
Form类
我们已经计划好了我们的HTML,表单应该呈现的样子。在Django中,我们的起始点是这里:
node2:/django/mysite/news#cat forms.py
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
它定义一个Form类,只带有一个字段(your_name)。我们已经对这个字段使用一个友好的标签,
当渲染时它将出现在<label>中
字段允许的最大长度通过max_length 定义。 它完成两件事情,首先.
它在HTML 的<input> 上放置一个maxlength="100"
Form的实例具有一个is_valid() 方法,
视图:
发送给Django 网站的表单数据通过一个视图处理,一般和发布这个表单的是同一视图,
这允许我们重用一些相同的逻辑
要操作一个通过URL发布的表单,我们要在视图中实例表单。
如果访问视图的是一个GET请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。
这是我们在第一次访问该URL时预期发生的情况。