• Form组件 cookie和session


    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'})
    
    

    第三步查看数据校验是否合法

    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组件渲染标签

    def   reg(request):
    	form_obj = MyForm()
    	return render(request,'reg.html',locals())
    

    第一种 一行代码渲染所有的数据(扩展性差)

    {{ form_obj.as_p }} 
    {{ form_obj.as_ul }}
    

    第二种

    <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.email }}</p>
            <input type="submit">
    </form>
    

    渲染指定后端字段

    后端可以通过在定义字段的时候加上默认属性
    from django import forms
    
    class MyForm(forms.Form):
            name = forms.CharField(max_length=6,lable = '用户名')
            password = forms.CharField(max_length=8,min_length=3,lable='密码')
            email = forms.EmailField(required=True)
    

    第三种(p标签)

    <form action="">
        {% for foo in form_obj %}
                <p>{{ foo.label }}{{ foo }}</p>
        {% endfor %}
    </form>
    
    	前端取消校验
    		<form action="" method="post" novalidate>
    		</form>
    

    综合使用

    • 错误提示消息为中文
    • 用户输入错误之后保留原来的数据

    局部钩子和全局钩子

    		# 局部钩子函数  (单个字段的校验利用局部钩子函数)
    		def clean_name(self):
    			name = self.cleaned_data.get('name')
    			if '666' in name:
    				self.add_error('name','光喊666是不行的,要有真实力!')
    			return name  # return还是要加上的,兼容性考虑
    
    
    		# 全局钩子函数  (多个字段的校验利用全局钩子函数)
    		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',"两次密码不一致,你这个dsb!")
    			return self.cleaned_data
    

    创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

    initial

    初始值,input框里面的初始值。

    class LoginForm(forms.Form):
        username = forms.CharField(
            min_length=8,
            label="用户名",
            initial="张三"  # 设置默认值
        )
        pwd = forms.CharField(min_length=6, label="密码")
    

    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)
        )
    

    radioSelect

    单radio值为字符串

    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="密码")
        gender = forms.fields.ChoiceField(
            choices=((1, "男"), (2, "女"), (3, "保密")),
            label="性别",
            initial=3,
            widget=forms.widgets.RadioSelect()
        )
    

    单选Select

    class LoginForm(forms.Form):
        ...
        hobby = forms.ChoiceField(
            choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
            label="爱好",
            initial=3,
            widget=forms.widgets.Select()
        )
    

    多选Select

    class LoginForm(forms.Form):
        ...
        hobby = forms.MultipleChoiceField(
            choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
            label="爱好",
            initial=[1, 3],
            widget=forms.widgets.SelectMultiple()
        )
    

    单选checkbox

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

    多选checkbox

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

    choice字段注意事项

    在使用选择标签时,需要注意choices的选项可以配置从数据库中获取,但是由于是静态字段 获取的值无法实时更新,需要重写构造方法从而实现choice实时更新。

    方式一:

    from django.forms import Form
    from django.forms import widgets
    from django.forms import fields
    
     
    class MyForm(Form):
     
        user = fields.ChoiceField(
            # choices=((1, '上海'), (2, '北京'),),
            initial=2,
            widget=widgets.Select
        )
     
        def __init__(self, *args, **kwargs):
            super(MyForm,self).__init__(*args, **kwargs)
            # self.fields['user'].choices = ((1, '上海'), (2, '北京'),)
            # 或
            self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')
    

    方式二:

    from django import forms
    from django.forms import fields
    from django.forms import models as form_model
    
     
    class FInfo(forms.Form):
        authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选
        # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选
    

    添加样式

    		from django import forms
    		from django.forms import widgets
    		password = forms.CharField(max_length=8,min_length=3,error_messages={
    							'max_length': '密码最长8位',
    							'required': '密码不能为空',
    							'min_length':'密码最少3位'
    							},widget=widgets.PasswordInput(attrs={'class':'c1 form-control'}))
    		
    		
    				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()
    			)
    	
    
    		
    			obj = HttpResponse()
    			return obj
    			obj = render()
    			return obj
    			obj = redirect()
    			return obj
    		
    			
    			设置cookie
    				obj.set_cookie()  # 给浏览器设置cookie
    			
    			获取cookie
    				request.COOKIE.get('name')
    				request.COOKIE['name']
    		
    
    		def login(request):
    			if request.method == 'POST':
    				username = request.POST.get('username')
    				password = request.POST.get('password')
    				if username == 'jason' and password == '123':
    					old_path = request.GET.get('next')
    					if old_path:
    						obj = redirect(old_path)
    					else:
    						obj = redirect('/home/')
    					# 用户登录成功 朝浏览器设置一个cookie
    					obj.set_cookie('name','jason',expires=7*24*3600)
    					return obj
    			return render(request,'login.html')
    

    用户登录装饰器

    		from functools import wraps
    		def login_auth(func):
    			@wraps(func)
    			def inner(request,*args,**kwargs):
    				# 校验cookie
    				# print(request.get_full_path())
    				old_path = request.get_full_path()
    				if request.COOKIES.get('name'):
    					return func(request,*args,**kwargs)
    				return redirect('/login/?next=%s'%old_path)
    			return inner
    		
    		
    		def logout(request):
    			rep = redirect("/login/")
    			rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    			return rep
    

    ​ django默认的session存活时间是两周(14天)

  • 相关阅读:
    node-webkit 不支持html5_video播放mp4的解决方法
    node-webkit(Windows系统) 打包成exe文件后,被360杀毒软件误报木马的解决方法
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    Leetcode96. 不同的二叉搜索树
    Leetcode95. 不同的二叉搜索树 II
    leetcode1493. 删掉一个元素以后全为 1 的最长子数组
    Leetcode1052. 爱生气的书店老板
    Leetcode92. 反转链表 II
    Leetcode495. 提莫攻击
  • 原文地址:https://www.cnblogs.com/ruhai/p/11042600.html
Copyright © 2020-2023  润新知