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

转载于:https://www.cnblogs.com/ruhai/p/11042600.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值