forms组件展示提示信息

"""
使用forms组件渲染标签之后在获取用户数据的时候
浏览器会自动帮助我们校验数据
但是浏览器层面的数据校验弱不禁风没有实际意义
"""
# 如何取消浏览器自动校验数据的功能
<form action="" method="post" novalidate>

def login(request):
    # 1.先生成一个对象
    form_obj = MyForm()
    # 3.判断请求方式
    if request.method == 'POST':
        # 获取用户数据
        # request.POST  # 可以直接看成是一个字典
        # 校验用户数据
        # MyForm()  # forms组件校验数据刚好需要传入一个字典
        '''上述两步合一步'''
        form_obj = MyForm(request.POST)
        if form_obj.is_valid():
            return HttpResponse('登录成功')
    # 2.将该对象传递给html页面
    return render(request,'login.html',locals())

{% for form in form_obj %}
        <p>
            {{ form.label }}:{{ form }}
            {{ form.errors.0 }}
        </p>
    {% endfor %}

forms组件常用参数

max_length			最大范围
min_length			最小范围
label				字段文本内容
required			字段是否必填 默认是True
error_messages		 定义提示信息
widget				定义字段类型和属性
validators			额外的校验功能(一般都是正则)
initial			    设置默认值

forms组件钩子函数

提供更加复杂的与业务相关的校验功能
钩子函数其实就在书写forms类的过程中定义方法

'''钩子函数都是在数据校验的最后一个环节执行'''
局部钩子(单个字段校验使用局部)
	# 校验当前用户名是否已存在
    def clean_username(self):
        # 获取用户名
        username = self.cleaned_data.get('username')
        # 查询数据库并判断
        if username == 'jason':
            # 提示用户名已存在
            self.add_error('username','用户名已存在')
        return username

全局钩子(多个字段校验使用全局)
	# 校验密码与确认密码是否一致
    def clean(self):
        # 获取密码 与 确认密码
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password','两次密码不一致')
        return self.cleaned_data

forms组件其他字段补充

gender = forms.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )
    hobby = forms.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )
    hobby1 = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )

    keep = forms.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )

    hobby2 = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

forms组件源码

参考文件

cookie与session

HTTP协议四大特性
	1.基于请求响应
    2.基于TCP、IP作用于应用层之上
    3.无连接
    4.无状态
    	
基于HTTP协议的通信无法记录客户端状态
但是现在很多软件都需要记录用户的状态 为了解决这个问题
发明了cookie session等一系列的技术

cookie
	保存在客户端浏览器上面的键值对数据
    """
    eg:当用户登录成功之后 浏览器保存用户的关键信息
    以后访问的时候浏览器自动发送关键信息从而实现身份识别
    
    关键型数据直接保存在浏览器上不安全
    """ 
session
	保存在服务器上面的键值对数据(数据类型不固定)
    """
    eg:当用户登录成功之后 服务端返回给浏览器一个随机字符串
    之后访问都将随机字符串发送给服务端
    服务端内部做比对
    """
# session需要依赖于cookie才可以工作
客户端浏览器可以保存服务端发送过来的cookie数据也可以选择拒绝

cookie操作

视图函数返回的HttpResponse对象
return HttpResponse()
return render()
return redirect()
...


obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj

# 用户登录
	设置cookie
    	obj = HttpResponse("登录成功")
    	obj.set_cookie('name','jason')
    获取cookie
    	request.COOKIES.get('name')
    删除cookie
    	obj.delete_cookie("name")

session操作

session设置
    request.session['name'] = 'jason'
    """
    1.自动产生一个随机字符串
    2.将随机字符串和数据存入django_session表中
    3.将随机字符串返回给客户端浏览器保存
    """

session读取
    request.session.get('name')
	"""
	1.客户端请求中获取随机字符串
	2.拿着随机字符串去django_session表中比对
	3.如果比对成功获取对应的数据并且解析放到request.session中
	"""
# django session默认的过期时间14d 可以人为修改


# 删除当前会话的所有Session数据
	request.session.delete()  # 只删客户端浏览器
  
# 删除当前的会话数据并删除会话的Cookie。
	request.session.flush()  # 客户端浏览器和服务端都删

 
# 设置会话Session和Cookie的超时时间
	request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
        

posted on 2021-06-01 09:48  lzl_121  阅读(27)  评论(0编辑  收藏  举报