Django框架之Form组件、cookie与session

Form介绍

我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。

Django form组件的主要功能:

1.渲染标签
2.校验数据
3.展示信息

校验数据

第一步需要一个form类
from django import forms

class MyForm(forms.Form):
  name = forms.CharField(max_length=6)

  password = forms.CharField(max_length=8,min_length=3)

  email = forms.EmailField(required=True)

第二步实例化form对象
form_obj = MyForm({'name':'jason'})

可以在Python_Console里面进行测试

 

第三步查看数据校验是否合法
form_obj.is_valid() # 只有当所有的字段都校验通过才会返回True

第四步查看校验错误的信息
form_obj.errors # 这个里面放的是所有校验未通过的字段及错误提示
"""
{
'name': ['Ensure this value has at most 6 characters (it has 7).'],
'password': ['Ensure this value has at least 3 characters (it has 2).'],
'email': ['Enter a valid email address.']
}

"""

第五步查看校验通过的数据
form_obj.cleaned_data # 符合校验规则数据都会被放到该对象中

ps:form组件校验数据的规则从上往下依次取值校验
校验通过的放到cleaned_data
校验失败的放到errors

注意:
form中所有的字段默认都是必须传值的(required=True)
校验数据的时候可以都传(多传的数据不会做任何的校验>>>不会影响form校验规则)

渲染标签

form组件只帮你渲染获取用户输入的标签,不会帮你渲染提交按钮,需要手动添加
<h1>第一种渲染方式(可扩展性较差)</h1>
{{ form_obj.as_p }}
{{ form_obj.as_ul }}

<h1>第二种渲染方式</h1>
<form action="">
<p>{{ form_obj.name.label }}{{ form_obj.name }}</p>
<p>{{ form_obj.password.label }}{{ form_obj.password }}</p>
<p>{{ form_obj.email.label }}{{  form_obj.password }}</p>
<input type="submit">
</form>

<h1>第三种渲染标签的方式</h1>  #foo相当于2中的form_obj.name、 form_obj.password、 form_obj.password
<form action="">
{% for foo in form_obj %}
<p>{{ foo.label }}{{ foo }}</p>
{% endfor %}

<input type="submit">
</form>

label的值默认是Form类里的属性,可以改

前端取消校验(post请求校验不通过无法跳转,无法达到测试效果)
<form action="" method="post" novalidate>
</form>

form组件提交数据如果数据不合法,页面上会保留之前用户输入的信息

error_messages(重写错误信息)

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")

password(密文)

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
    )

在使用form组件对模型表进行数据校验的时候,只需要保证字段一致
那么在创建数据对象的时候你就直接**form_obj.cleaned_data

钩子函数

局部钩子(校验一个字段)

字段都执行通过之后的校验

全局钩子(校验多个字段)

 

cookie

设置cookie
obj.set_cookie() # 给浏览器设置cookie

获取cookie
request.COOKIE.get('name')
request.COOKIE['name']

如果获取不到cookie的值就返回登录页面

给index函数加装饰器

跳转到登录页面提交后再跳转回原来的页面

装饰器能拿到跳转到login页面之前的路径

cookie设置失效时间

obj.set_cookie('name','jason',expires=7*24*3600)

 

session

获取Session中数据
request.session.get('name')
设置Session中数据
request.session['name'] = 'jason'

删除当前会话的所有Session数据
request.session.delete()

删除当前的会话数据并删除会话的Cookie
request.session.flush() 
 
posted @ 2019-06-17 22:30  士大夫给力  阅读(156)  评论(0编辑  收藏  举报