今日内容概要
- forms组件源代码
- cookie与session
- 视图函数(CBV)如何添加装饰器

今日考题
"""
答案
1.简述自定义分页器的使用
现在根目录下创建一个utils文件夹,在里面创建一个python文件,拷贝源代码进去
修改参数,到自己想定制的分页器的数据
在后端先导入这个python文件
在后端创建一个函数,把所有的默认值的参数算出来,一个利用count算出,一个用
request.GET.get算出来,然后用这两个参数创建拷贝的类的对象
给对象直接用start和end来切片,最后return到前端
前端直接在需要地方写{{ obj.html_page }}
2.forms组件是干什么用的,它的主要功能有哪些功能,你能否
具体说说每个功能下都有哪些经常用到的方法及注意事项(越详细越好)
forms组件可以渲染标签,校验数据和展示数据
校验数据:
pycharm里面有个python console 里面可以模拟校验数据
方法有:obj.is_valid() 检验数据合法与否
obj.cleanes_data 查看所有合法的数据
obj.errors 查看不合法的数据,以及不合法的原因
还有钩子函数:局部:只校验一个字段,全局:校验多个字段
渲染标签:
后端先建造一个类。继承forms.From
然后类里面建造好一个个的字段
在前端直接{{ form }}可以拿到框,{{ form.label}} 可以拿到字段名字
展示数据: 一般用在提示报错信息上
直接在在span里面{{ forms.errors.0 }}就可以,固定用法
3..forms组件钩子函数是干什么用的,如何编写,请举例说明,除
此之外forms组件还提供了哪些校验方法
钩子函数也是用来校验数据的,分局部和全局钩子函数
局部钩子: 在类里面定义函数
def clean_username(self):
usernmae = self.cleaned_data.get('username')
if '条件' in username:
sele.add_error('username', '用户名不可以有条件')
return username
全局钩子:
def clean(self):
password = self.cleande_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if not confirm_password == password:
self.add_error('confirm_password', '两次密码不一致')
return cleaned_data
内容回顾
- 自定义分页器的使用
"""
当你在项目中需要使用第三方的功能代码或者自己封装的一些功能代码
那么一般情况下都是会新建一个文件夹(utils)专门用来存储相关的代码
该文件夹既可以建在全局 也可以在每个应用下都创建属于该应用独有的
封装代码的思路
1.先用最粗燥的代码完成功能
2.在功能完成的基础之上再去考虑优化
1.先由面条版封装成函数
2.再看看能不能封装成面向对象
并不是说一定需要封装成面向对象的形式 要看情况
"""
# 代码无需掌握直接拷贝使用即可
# 后端使用
book_queryset = models.Book.objects.all() # 惰性查询
current_page = request.GET.get('page',1)
all_count = book_queryset.count()
page_obj = Pagenation(current_page=current_page,all_count=all_count)
page_queryset = book_queryset[page_obj.start:page_obj.end]
# 只需要将page_obj,page_queryset传递给html页面即可
# 前端使用(自定义分页器需要使用bootstrap)
{{ page_obj.page_html|safe }}
- forms组件
"""
1.渲染标签
2.校验数据
3.展示信息
"""
from django import forms
class MyForm(forms.Form):
username = forms.CharField(label='用户名',max_length=8,min_length=3)
# 校验数据
# 1 给类传字典
form_obj = MyForm({'username':'jason'})
# 2 判读数据是否合法
form_obj.is_valid() # 只有所有的数据都符合条件才会为True
# 3 如何查看符合条件数据
form_obj.cleaned_data
# 4 如何查看不符合条件的以及原因
form_obj.errors
# 5 forms类中所有的字段默认都是必填的
# 6 校验的数据可以多传但是不能少传
# 渲染标签
# 1 第一种
{{ form_obj.as_p }}
# 2 第二种
{{form_obj.username.label}}{{form_obj.username}}
# 3 第三种(常用)
{% for form in form_obj %}
{{ form.label }}:{{ form }}
<span>{{ form.errors.0 }}</span>
{% endfor %}
# 展示错误信息
{% for form in form_obj %}
{{ form.label }}:{{ form }}
<span>{{ form.errors.0 }}</span>
{% endfor %}
username = forms.CharField(label='用户名',
max_length=8,
min_length=3,
error_messages={
'required':"用户名必填",
...
}
)
- 钩子函数
"""
局部钩子
校验单个字段
全局钩子
校验多个字段
"""
def clean_username(self):
self.add_error('username','用户名错误')
return username
def clean(self):
return self.cleaned_data
- 重要参数
label
min_length
max_length
required
initial
error_messages
validator
widget
"""
针对字段的校验有很多种
1.最简单的min_length
2.正则validator
3.钩子函数
前端的校验的可有可无 但是后端的校验一点都不能含糊
form表单如何取消浏览器自动校验功能
<form novalidate></form>
"""
- 其他字段
radio
checkbox
select
forms组件源码
"""
cookie与session
"""
Cookie操作
# 虽然cookie是服务端告诉客户端浏览器需要保存内容
session操作
"""
CBV如何添加装饰器
from