昨日回顾
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组件参数配置
error_messages
={'min_length': '太短了小伙子'}
class MyForm(forms
.Form
):
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 局部钩子和全局钩子
def clean_name(self
):
name
= self
.cleaned_data
.get
('name')
if name
.startswith
('sb'):
raise ValidationError
('不能以sb开头')
else:
return name
def clean(self
):
password
= self
.cleaned_data
.get
('password')
re_password
= self
.cleaned_data
.get
('re_password')
if password
== re_password
:
return self
.cleaned_data
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
):
obj
=HttpResponse
('ok')
obj
.set_cookie
('name','egon')
obj
.set_cookie
('age','19')
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视图函数上