django之form组件、cookie、session

django之form组件、cookie、session

django form组件

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

校验数据

# 第一步需要一个form类
from django import forms
class MyForm(forms.Form):
    name = forms.CharField(max_length=8)
    password = forms.CharField(max_length=8,min_length=3)
    email = forms.EmailField()

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

# 第三步查看数据校验是否合法
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  # 符合校验规则的数据都会被放到该对象中

注意:

form组件校验数据的规则从上而下一次取值校验

检验通过的放到cleaned_data

检验未通过的放到errors

form中所有的字段默认都是必须传值的(required=True)

检验数据的时候可以多传(多传的数据不会做任何的校验,也不会影响form校验规则)

渲染标签

form组件只帮你渲染获取用户输入的标签,不会帮你渲染提交按钮,需要手动添加

<h1>第一种渲染方式</h1>
{{form_obj.as_p}}
{{form_obj.as_ul}}

<h1>第二种渲染方式</h1>
<form>
    <P>
        {{form_obj.name.lable}}{{form_obj.name}}
    </P>
    <P>
        {{form_obj.password.lable}}{{form_obj.password}}
    </P>
    <P>
        {{form_obj.email.lable}}{{form_obj.email}}
    </P>
    <input type='submit'>
</form>

<h1>第三种渲染方式</h1>
<form>
    {% for foo in form_obj %}
        <P>
            {{foo.lable}}{{foo}}
        </P>
    {% endfor %}
    <input type='submit'>
</form>

前端取消校验

<!--前端页面不会谈框出来-->
<form action='' method='post' novalidate>  

</form>

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

def reg(request):
    # 生成一个空对象
    form_obj = MyForm()
    if request.method == 'POST':
        print(request.POST)
        form_obj = MyForm(request.POST)
        if form_obj.is_valid():
            print(form_obj.cleaned_data)
            models.User.objects.create(**form_obj.cleaned_data)
    return render(request,'reg.html',locals())

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

<form action='' method='post' novalidate>
    {% for foo in form_obj %}
        <p>
            {{foo.lable}}{{foo}}
            <span>{{foo.errors.0}}</span>
    </p>
    {% endfor %}
    <input type='submit'>
</form>

钩子函数

局部钩子函数

# 在定义的Myform类下定义函数
def clean_name(self):  #
    name = self.cleaned_data.get('name')
    if '666' in name:
        self.add_error('name','有6不行')  # 给字段添加错误信息
    return name 

全局函数(多个字段的校验利用全局钩子函数)

def clean(self):
    password = self.cleaned.data.get('password')
    confirm_password = self.cleaned.data.get('confirm_password')
    if  password != confirm_password:
        seld.add_error('confirm_password','密码不一致')
    return self.cleaned_data

设置标签样式

from django import forms
from django.froms import widgets
password = froms.CharField(max_length=3,error_messages={
    'max_length':'密码最长8位',  # 将报错信息改成中文
    'required':'密码不能为空',
    'min_length':'密码最少3位'
},widgets.PasswordInput(attrs={'class':'c1 form-control'}))  # 给密码字段设置样式,并且改为密文

单选

gender = forms.ChoiceField(
    choices = (1,'男'),(2,'女'),(3,'保密'),
    label = '性别',
    inital = 3,  # 默认选3
    widget = forms.widgets.RadioSelect()
)

下拉单选

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

多选

hobby = forms.ChoiceField(
    choices = (1,'篮球'),(2,'足球'),(3,'双色球'),
    label = '爱好',
    initial =[1,3],
    widget = forms.widgets.SelectMultiple()
)
keep = forms.ChoiceField(
    label = '是否记住密码',
    initial = 'checked',
    widget = forms.widgets.ChoiceboxInput()
)

cookie

保存在客户端浏览器上的键值对

原理:

由服务器产生内容,浏览器收到请求后保存在本地,当浏览器再次访问时,浏览器会自定带上cookie,这样服务器就能通过cookie的内容来判断

获取cookie

request.COOKIES['key']
request.COOKIES.get('key')

设置cookie

obj = HttpResponse(...)
obj = render(request,...)

obj.set_cookie('key','value',expires=7*24*3600)  # expire设置过期时间

obj.set_cookie('key','value',max_age=7*24*3600)  # max_age设置过期时间,但是不支持IE浏览器

删除cookie

def logout(request):
    res = redirect('/login/')
    res.delete_cookie('user')  # 删除之前设置的uesrcookie值
    return res

登录装饰器

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        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 login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'lucas' and password == '123':
            old_path = request.GET.get('next')  # 从装饰器中获取get请求携带的一开始输入的地址
            if old_path:
                obj = redirect(old_path)  # 跳转到老路径
            else:
                obj = redirect('/home/')
            obj.set_cookie('name':'lucas',expires=7*24*3600)
            return obj
        return render(request,'login.html')

session

session是保存在服务端上的,有较高的安全性

  • 1.先生成一个随机的字符串
  • 2.在django session表中存储该随机字符串与数据的记录
  • 3.将随机的字符串发送给客户端浏览器

设置session

request.session['name'] = 'lucas'

获取session

  • 1.django自动获取浏览器随机字符串,去django session表里对比
  • 2.如果对比成功,会将当前随机字符串对应的数据赋值给request.session
  • 3.通过request.session操作该数据(数据不存在也不会影响业务逻辑)
request.session.get('name')

浏览器会设置一个键为sessionid来存放session值

删除当前会话的所有session数据

request.session.delete()

删除当前的会话数据并删除会话的cookie

request.session.flush()  # 这用于确保前面的会话数据不可以再次被用户的浏览器访问

设置会话session和cookie的超时时间

request.session.set_expiry(value)

如果value是个整数,session会在value秒数后失效

如果value是个datatime或timedelta,session就会在这个时间后失效

如果value是0,用户在关闭浏览器session就会失效

如果value是None,session会依赖全局session失效策略

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

原文地址:https://www.cnblogs.com/yanminggang/p/11042728.html

时间: 2024-08-09 03:13:05

django之form组件、cookie、session的相关文章

form组件+cookie+session总结

1.forms 组件 -数据校验功能 1.定义 -新建一个py文件 -导入from django import forms -写一个类继承 forms.Form -把你需要校验的(字段的条件)属性写到类里面 -比如:name = forms.CharField(max_length=8,min_length=3,label="用户名", error_messages={"max_length":"超出范围", "min_length&q

Python之路【第二十一篇】:Django之Form组件

Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from django.forms import Form from django.forms import widgets from django.forms imp

【Django】Form组件

目录 Form组件介绍 常用字段与插件 Form组件中所有内置字段 从数据库中获取数据 校验示例 检验手机号是否合法 方式一(基本操作) 方式二(自定义验证规则) 方式三(利用钩子) 验证密码一致性 钩子 局部钩子 全局钩子 进阶 批量添加样式 ModelForm Form套Form @ *** Form组件介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,

Python Django 多对多三种创建方式 form组件 cookie和session

一 表中多对多关系三种创建方式 以Book表和Author表多对多关系例 1.第一种方式:全自动(推荐使用):models.ManyToManyField(to='类名') 优点:不需要你手动创建第三张表 缺点:第三张表不是你手动创建的,字段是固定的无法拓展 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_place

Django组件-cookie,session

昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反序列化方法:JSON.parse() ajax $.ajax({ url:"", type:"", data:{}, // 默认contentType="urlencoded" success:function(data){ } }) 一.Djang

CSIC_716_20200113【Django入门---forms组件、session和cookie、登录认证装饰器】

forms组件 forms组件的功能:1.渲染前端页面,不用在前端手写forms表单了,不过只会渲染用户输入(输入.选择.下拉.文件)的标签,不渲染按钮以及form表单标签,.2.后端能进行非常规范的数据合法性校验3.展示校验之后的合法性信息. 使用方法:1.定义一个自定义forms类 form组件的前端渲染方式 效果差不多 哈哈哈哈 顶 原文地址:https://www.cnblogs.com/csic716/p/12189236.html

六十一、Django之form组件

一.form组件 1.校验数据 # 第一步需要一个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({'nam

django之Form组件一

一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),count,first,last,esits(判断是否存在) 需要掌握的all.values.values_list的区别 all:打印的是一个QuerySet集合,一个列表里面放的对象 values :是一个字典形式 values_list:是一个元组形式 all的性能是最低的 2.only和def

Django之Form组件

Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from django.forms import Form from django.forms import widgets from django.forms import fields class MyForm(Form): user = fields.CharField( widget=widgets.Tex