表单可用于用户提交数据,Django可通过对表单数据进行操作进行数据验证、有效性检查等其他处理。
一、从request中获取form表单数据
request是Django传递给view视图函数的第一个参数,是一个HttpRequest对象,它包含了用户信息等数据。
1.URL的相关信息
属性:
request.path:除域名以外的请求路径。如/admin/,以斜杠开头
request.META:包含了HTTP请求的HEADER信息,如IP、用户浏览器信息等。是一个字典
键: 值
wsgi.url_scheme | |
RAW_URI | |
CSRF_COOKIE | |
HTTP_ACCEPT | |
HTTP_ACCEPT_LANGUAGE | |
SERVER_SOFTWARE | |
wsgi.multithread | |
wsgi.version | |
wsgi.run_once | |
HTTP_USER_AGENT | |
SERVER_PROTOCOL | |
REMOTE_PORT | |
gunicorn.socket | |
HTTP_COOKIE | |
wsgi.errors | |
HTTP_ACCEPT_ENCODING | |
HTTP_UPGRADE_INSECURE_REQUESTS | |
wsgi.input | |
REMOTE_ADDR | |
SERVER_PORT | |
HTTP_CONNECTION | |
wsgi.file_wrapper | |
PATH_INFO | |
wsgi.multiprocess | |
HTTP_CACHE_CONTROL | |
SERVER_NAME | |
HTTP_HOST | |
REQUEST_METHOD | |
SCRIPT_NAME | |
QUERY_STRING |
request.get_host():主机名,
request.get_full_path():完整请求路径,包含可能的参数,“?data=1”
request.is_secure():如果是https方式访问,则为True,否则为False
request.POST:HTML通过<form>方式提交的数据,是一个类字典对象,包含了普通字典对象属性及方法以及其他属性及方法。
用户提交的HTML表单中,对应标签name值为POST中的键,标签的输入值就是POST的对应键的值了。
request.GET:通过<form>提交的数据,或者来自于URL中的查询字符串。
在HTML中表示一个表单:
<form action='' method='post'>
<input type='text' name='username'>
<input type='password' name='password'>
<input type='submit' value='login'>
</form>
注:什么时候使用POST或者GET。当不改变服务器状态时,仅用于获取数据时,使用GET,否则使用POST。另外,参考服务器的GET、POST数据大小设置。
过程:
HTML中定义form表单数据,通过request传递给view视图,view视图从POST中获取表单数据,验证有效性及合法性,通过可能的数据库检索获取数据,组成context渲染HTML后返回浏览器显示。
注:当视图不指向其他HTML时,在HTML的表单中action可以为空。意味着将表单提交给与当前页面相同的URL。
在含POST的请求成功处理后,最好使用HttpResponseRedirect重定向至其他页面,避免反复提交POST请求。
原始的Django表单处理,通过Html传递的请求中,获取POST数据,并手动if判断数据合法性,有效性等,然后处理数据,如果不符合数据要求,再返回对应数据并修改HTML,以支持数据传入。这样的方式极其繁杂。
Django支持newform库(form库)来做这些HTML表单显示以及验证事情。对每一个将要处理的HTML的<form>定义一个Form类,这个类可以存放在任意位置,然后在views中导入即可。
这个Form类的依赖于django的forms库,forms库有一个Form类,我们自己定义的Form类需继承自这个标准Form类,自定义类名称随意,自定义类的内容将表单内容作为属性实现。
class Login(forms.Form):
username = forms.CharField()
message = forms.CharField(required = False) # 参数required为False表示可选项
注,如果想要更改在HTML中的显示逻辑,可以通过在字段后增加widget属性赋值方式更改,如widget=forms.Textarea,将指定该字段已Textarea方式显示。若要指明最大长度,可在字段后增加max_length属性
widget:显示逻辑组件。
max_length:长度校验判断逻辑(min_length参数显示最小长度逻辑)
Field类指明校验逻辑,widget指明显示逻辑。
label:指明在HTML中的显示字样,默认是首字母大写,空格代替下划线
另若是想给实例赋一个初始值(默认值),可以在实例化的时候传入initial参数,值为字典(键为字段)。传值与使用initial传默认值的最大区别是默认值的传入不会改变bound状态,而传值则会改变状态。
自定义校验条件:
Django的forms在校验时,除了会校验已显示定义的数据,还会校验自定义的校验规则,通过搜索clean开头,以字段名结尾的方法作为校验规则被调用,且该自定义校验规则实在指定字段的默认校验逻辑执行之后再被调用的。
做的事情:
1.自动转换为HTML代码:在实例化这个类的时候,Django会自动转换成对应的HTML,默认是表格格式(<table>),也可以通过实例方法as_ul()#列表格式 as_p()段落格式(实际验证后可以看到<form>等标记没有包含,可以自己添加额外的格式或内容),可以通过像字典处理一样显示各个字段的HTML,如实例.['message']单独显示message段的HTML
2.数据校验及获取校验错误提示:可以传入参数实例化这个类,一旦对实例进行赋值,就得到了一个绑定数据后的form实例,可以查看实例的is_bound属性确认是否绑定了数据。可以查看已绑定的实例的is_valid()方法,验证数据是否合法。可以通过实例.['message'].errors显示对应的出错信息,如果该字段校验错误,则会显示对应提示,否则显示空列表。form实例都有一个errors属性提供了一个字段与错误信息相映射的字典表。
3.使用字典包含提交的数据。若Form实例的数据是合法的,实例会有一个cleaned_data属性,该属性为包含对应的提交数据的字典。注:对应的字符串会被处理为Unicode对象,其他类型数据会使用合适的python对象。如int/datetime.date等