140 form自定错误和钩子,django中cookie的使用

昨日回顾

1 分页器组件,django提供给咱么一个类,传入要分页的数据,每页有多少数据
	-Paginator分页器对象:count,get_page,num_pages,page_range
    -Page对象:has_next,has_previous,next_page_number,previous_page_number,object_list
    
2 form 组件:可以做数据校验
	-自己定义一个类,继承Form,在类里写字段
    -name=form.CharField()
    -字段属性:required=False, max_length=32, min_length=3,label='用户名'
    -在视图函数中使用,实例化得到一个Form对象,传入要校验的数据
    -Form对象.is_valid()
    -Form对象.clean_data  :字典,不管成功与失败,都能拿到clean_data
    -Form对象.errors      :字典,重写了__str__方法,本质是字典
    	-Form对象.errors.get('name')--->错误信息,多条,列表
        -errors对象有些方法,as_data,as_json....
        
3 form 组件:渲染页面
	-模板中:自己写标签
    -实例化得到一个空Form对象
    -在模板中:
        {{form.name.label}}
        {{form.name}}  
    -在模板中:
        {% for foo in form %}
           <p>{{ foo.label }} :{{ foo }}</p>
        {% endfor %}
    -在模板中:
    	{{ form.as_p }}
        
   	-生成的标签:<input type="text" name="name" maxlength="32" minlength="3" id="id_name" />
    -生成的id 是id_字段名

今日内容

1 forms渲染错误信息

1 form对象.errors 字典
2 name对象.errors

## 视图函数
def register(request):
    if request.method=='GET':
        form=myforms.MyForm()
        return render(request, 'register.html',{'form':form})
    else:
        form=myforms.MyForm(request.POST)
        if form.is_valid():
            return redirect('http://www.baidu.com')
        else:
            return render(request, 'register.html',{'form':form})
            ## 模板
 <form action="" method="post" novalidate>
	{% for foo in form %}
	<div class="form-group">
        <label for="">{{ foo.label }}</label>
            {{ foo }}
            <span class="text-danger pull-right">{{ foo.errors }}</span>
        </div>
	{% endfor %}
	<div class="text-center">
		<input type="submit" value="提交" class="btn btn-danger">
	</div>
</form>

2 form组件参数配置

# 定制模板中的显示样式,及配置类
# widget=widgets.PasswordInput(attrs={'class': 'form-control'})
# 错误信息中文显示
error_messages={'min_length': '太短了小伙子'}


class MyForm(forms.Form):
    # 校验这个字段,最大长度是32,最小长度是3
    name = forms.CharField(required=False, max_length=32, min_length=3, label='用户名',
                           widget=widgets.TextInput(attrs={'class': 'form-control'}),
                           error_messages={'min_length': '太短了小伙子'})
    password = forms.CharField(required=False, max_length=32, min_length=3, label='密码',
                               widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                               error_messages={'min_length': '太短了小伙子'})
    re_password = forms.CharField(required=False, max_length=32, min_length=3, label='确认密码',
                                  widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                                  error_messages={'min_length': '太短了小伙子'})
    email = forms.EmailField(label='邮箱', error_messages={'required': '小惠子,这个必填'},
                             widget=widgets.TextInput(attrs={'class': 'form-control'}))
    age = forms.IntegerField(max_value=200, min_value=0, label='年龄',
                             widget=widgets.TextInput(attrs={'class': 'form-control'}))
    text = forms.CharField(label='个人简介', widget=widgets.Textarea(attrs={'class': 'form-control'}))
    date = forms.CharField(label='出生日期', widget=widgets.DateInput(attrs={'class': 'form-control'}))

3 局部钩子和全局钩子

## 局部钩子的使用
    # 1 在自定义的Form类中写 clean_字段名
    # 2 取出字段的真正值,name=self.cleaned_data.get('name')
    # 3 判断自己的规则,如果判断失败,抛出ValidationError
    # 4 如果通过,return name
# 局部钩子
    def clean_name(self):
        # name对应的值,如何取到?
        name = self.cleaned_data.get('name')
        if name.startswith('sb'):
            # 不让校验通过
            raise ValidationError('不能以sb开头')
        else:
            # 校验通过,返回name
            return name
# 全局钩子
    def clean(self):
        # name=self.cleaned_data.get('name')
        # print(name)
        password = self.cleaned_data.get('password')
        re_password = self.cleaned_data.get('re_password')
        if password == re_password:
            return self.cleaned_data
            # return {'lqz':"nb"}
        else:
            raise ValidationError('两次密码不一致')

4 cookie session token

1 https://www.cnblogs.com/liuqingzheng/articles/8990027.htmlp
    
2 cookie:客户端浏览器上的键值对
3 session:存在服务端的键值对
4 token:加密的键值对,如果放在客户端浏览器上,它就叫cookie,  服务端签发的加密字符串

head.{name:lqz,age:18}.eseetsweasdca

base64加码:

asdfasfd.asdfasdf.asdfasdfaeraew

后端校验:
用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额
head.{name:lqz,age:18}.eseetsweasdca

head.{name:egon,age:18}.eseetsweasdca

5 django中cookie的使用

def cookie_test(request):
    # 浏览器向我这个地址发一个请求,就在浏览器写入 name = lqz

    obj=HttpResponse('ok')
    obj.set_cookie('name','egon')  # 写入到浏览器了,在http响应头里:cookie: name=lqz
    obj.set_cookie('age','19')  # 写入到浏览器了,在http响应头里:cookie: name=lqz
    return obj


def get_cookie(request):

    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('我拿了你传过来的cookie')


def delete_cookie(request):

    obj=HttpResponse('我删掉了你 name 这个cookie ')
    obj.delete_cookie('name')
    return obj

拓展

https://www.cnblogs.com/liuqingzheng/articles/8980355.html

企业级什么意思

Apache协议

作业

1 form组件的源码,找出局部钩子和全局钩子的位置

字段自己的校验完成后才执行局部钩子,
为什么名字一定要叫clean_字段名,
为什么校验失败抛出ValidationError,
为什么成功要把字段值返回,
为什么全局钩子是在以上所有校验通过才走,
为什么全局钩子返回一个自己写的字典,
在视图函数中拿到的就是返回的

2 通过form组件实现用户注册功能(样式好看,错误渲染,widgets,名字内不能带sb,个人简介里不能有 敏感词)

3 写3个路由和视图函数,一个是登录,写入cookie,访问order,必须登录以后才能访问,否则重定向到登录页面,退出功能,

4 (拓展)写个登录认证装饰器,加载order视图函数上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值