zoukankan      html  css  js  c++  java
  • forms组件

    forms组件
    先自己实现注册功能,并且对用户输入的信息加限制条件
    如果用户输入的信息不符合条件,前端展示报错信息

    注册示例:
    1.前端渲染标签获取用户输入 >>> 前端渲染标签
    2.后端获取用户输入,进行数据校验 >>> 数据校验
    3.校验过后产生的提示信息返回给前端 >>> 展示校验信息

    数据校验:
    前端后端都必须做数据校验,前端不做问题不大,后端必须要做!(防爬虫!!!)


    forms组件就能帮我们完成上面的三步:
    1.生成前端html代码
    2.校验数据
    3.展示校验信息

    forms组件的使用
    1.简单的form组件校验数据
    校验数据

    1.得写一个forms校验的类
    from django import forms
    class RegForm(forms.Form):
        # forms组件中定义的字段,默认都是必须传值的
        name = forms.CharField(max_length=6)
        pwd = forms.CharField(max_length=8,min_length=3)
        email = forms.EmailField()
    #2.实例化RegForm传值
    # 注意传入的字典的key必须跟类里面的变量名一致,校验的数据可以多传,但是不能少传
    res = views.RegForm({'name':'dsb','pwd':'123','email':'123@qq.com'})
    #3.数据是否合法 res.is_valid() # 如果数据全部校验通过才为True否则均为False
    #4.查看校验通过的数据 res.cleaned_data # 会将校验通过的数据都放入cleaned_data中 #5.查看校验失败的数据 res.errors # 会将校验失败的数据的提示信息都放入errors中 """ {'name': ['Ensure this value has at most 6 characters (it has 7).'], 'pwd': ['Ensure this value has at least 3 characters (it has 2).'] } """

    渲染标签
    form组件值渲染获取用户输入(或选择的...只要是用户操作都算)的标签
    提交按钮需要我们自己手动写

    //第一种

    {{ form_obj.as_p }}
    
    //第二种
    
    {{ form_obj.name.label }}{{ form_obj.name }}
    //第三种
    
    {% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}
                
                    
    展示报错信息
                        
    <form action="" method="post" novalidate>
                            
        {% for foo in form_obj %}
                            
          <p>
              {{ foo.label }}{{ foo }}
               <span>{{ foo.errors.0 }}</span>
          </p>
       {% endfor %}
       <input type="submit">
    </form>

    局部钩子与全局钩子

    
    
     # 局部钩子
    from django.core.exceptions import ValidationError
    class RegForm(forms.Form):

    def clean_name(self): name = self.cleaned_data.get('name') if '666' in name: # 局部钩子中可以手动添加报错信息 self.add_error('name','光喊666是不行的,得有操作!') # 也可以主动抛出异常 # raise ValidationError('光喊666是不行的,得有操作!') # 拿出来校验的数据必须返回回去 return name
    # 全局钩子
    from django.core.exceptions import ValidationError          
    class RegForm(forms.Form):
      def clean(self):
           pwd = self.cleaned_data.get('pwd')
           confirm_pwd = self.cleaned_data.get('confirm_pwd')
           if pwd == confirm_pwd:
           # 校验过后要把cleaned_data再返回出来
               return self.cleaned_data
           else:
             # 跟局部钩子不同,需要手动将报错信息加入到errors里面
            s  elf.add_error('confirm_pwd', '两次密码不一致')
    """
    发现新大陆,局部和全局添加报错信息,都可以通过self.add_error('字段','提示信息')局部钩子中还可以通过抛出异常的方式提示校验信息
    """    
    from app01 import models
    def reg3(request):
        # 实例化一个form对象
        form_obj = RegForm()
        if request.method == 'POST':
            print(request.POST)
            # 直接丢给form组件需要注意的前端的input name属性必须跟form里面字段的名一致
            form_obj = RegForm(request.POST)
          if form_obj.is_valid():
               models.User.objects.create(**form_obj.cleaned_data)
        return HttpResponse('ok')

    总结:forms组件可以实现三大功能,其实它的这些功能都是给我的models.py里面的一张张模型表服务的

    forms组件其他标签渲染类型(了解)



    Cookie和Session
    http协议不保存用户状态(信息)
    Cookie和Session都是为了能够保存用户信息

    Cookie:
    本质:保存在浏览器上的键值对
    用途:标识当前用户信息


    cookie是服务端设置的,浏览器可以选择禁用

    Session:
    本质:保存在服务器上的键值对
    用途:记录当前用户信息
    session其实也是基于cookie工作的
    为了数据更加安全,给浏览器存一个随机字符串,将用户信息存在服务端,
    sessionid:'随机字符串'
    用户在访问的时候,拿着这个随机字符串来后端进行匹配

    设置Cookie
    问题:django返回的信息都是什么对象?
    HttpResponse对象

    return render()
    return HttpResponse()
    return redirect()
                
                    
    res1 = render()
    return res1
    res2 = HttpResponse()
    return res2
    res3 = redirect()
    return res3

    设置Cookie
    需要通过HttpResponse对象来设值
    res1 = render()
    res1.set_cookie('name','jason')
    return res1
    获取Cookie
    request.COOKIES['key']
    request.COOKIES.get('key')


    设置Session (django 默认的session过期时间是14天)
    request.session['k1'] = 123
    # 上面这句话干了三件事
    # 1.内部自动生成一个随机字符串 一个浏览器对应一个
    # 2.将随机字符串与数据字典存入django session表中
    # 3.将随机字符串设置到浏览器的cookie中

    获取session
    request.session.get('k1')
    # 浏览器将随机字符串发送给服务端之后,服务端自动拿着随机字符串去
    # django_session表查找改字符串所对应的value(大字典),如果匹配成功会将这个value赋值给request.session
    # 如果没有,说明当前用户没有进行身份认证.建议使用request.session.get()来获取大字典

    删除session
    # 删除当前会话的所有Session数据
    request.session.delete() # 只删django_session表里的数据
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() # 表和浏览器的session都删除
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

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

    session数据是存放在服务器端的数据库中
    数据库可以有多种选择

  • 相关阅读:
    开通第一天,以此随笔作为纪念
    Apache 基于IP访问网站
    命令解释
    vi总结
    RAID
    Windows虚拟机安装
    CentOS虚拟机安装
    通过挂载系统光盘搭建本地yum仓库的方法
    VMware workstation 的安装
    Linux下关于vi命令的详细解说
  • 原文地址:https://www.cnblogs.com/dengyanchuan/p/10821602.html
Copyright © 2011-2022 走看看