form组件简单回顾 列表添加元素的方式 批量插入数据 自定义分页器 forms组件

append 尾部追加

extend 合并

insert 按照索引任意位置插入

批量插入数据

models.Book.objects.create()  # 用该方法批量插入数据的时候 效率极低

book_list = []
for i in range(100000):
	book_list.append(models.Book(...))

models.Book.objects.bulk_create(book_list)

自定义分页器

1.queryset对象支持切片取值
...
推导思路:
	1.直接后端手动切片
	2.url中通过get请求携带参数的方式 告诉后端到底想看第几页
		url?page=1
		current_page
	3.规定一页到底展示几条数据  
		per_page_num 
	4.对整体数据进行切片操作
		start_page = (current_page - 1) * per_page_num
		end_page = current_page * per_page_num
	5.前端渲染分页器页码
		1.如何知道需要展示多少个页码
			page_num, more = divmod(总数,每页展示的条数)
			if more:
				page_num += 1
		2.在后端利用for循环将所有的页码生成出来 展示给前端
	6.前端页码太多太多
		1.借鉴中国人的审美 页码设置成奇数位
		2.用户点击的当前页(高亮显示) 往前减五位  往后加五位
		3.当用户点击的页码数小于6 页码不应该在动了
			先定义个变量存储用户点击的当前页
			判断页码是否小于6,如果小于6 还是让等于6
直接封装成类的形式调用即可
	1.将写好的代码找一个py文件存一下
	2.导入该文件 用类实例化产生对象
	3.利用对象的方法对数据进行切片
		page_obj = Pagenation(current_page,all_count)
		page_queryset = data_queryset[page_obj.start:page_obj.end]
		
		前端页面for循环page_queryset
		利用{{ page_obj.page_html|safe }}

forms组件

使用:
	1.你必须要先写一个类
	from django import forms
	class MyRegForm(forms.Form):
		username = forms.CharField()
		password = forms.CharField()
		email = forms.EmailField()
1.渲染前端页面
	forms组件只能帮你渲染获取用户输入的标签 提交按钮需要你手动写
	
	三种渲染的方式
	1.首先你需要在后端生成空的MyRegForm的对象 传递到前端
		form_obj = MyRegForm()
		1.
			{{ form_obj.as_p }}
			{{ form_obj.as_ul }}
		2.
			{{ form_obj.username.label }}{{ form_obj.username }}
		3.
			{% for foo in form_obj %}
				{{ foo.label }}{{ foo }}
				{{ foo.errors.0 }}
			{% endfor%}       
2.校验用户数据
	1.需要给类传字典数据进行实例化
		form_obj = MyRegForm({'username':'jason','password':'123','email':'123'})
		# 1.如何判断传入的数据是否全部符合条件
		form_obj.is_valid()
		# 2.如何查看符合条件的数据
		form_obj.cleaned_data  # 字典
		# 3.如何查看没有通过校验的数据及原因
		form_obj.errors  # 字典
		"""
		1.forms组件默认所有的字段都必须传值
		2.不可以少传 但可以多传  多传的数据  不做任何处理
		
		"""
		
		
3.展示错误信息
	1.一堆参数
		label = '用户名'
		erros_messages = {
			'required':'用户名不能为空'
			...
		}
		初始值 
		widget = forms.widgets.TextInput(attrs={'class':'form-conytrol'})
		
4.钩子函数(Hook)
	全局钩子  
		直接在类中写方法
		eg:校验密码和确认密码是否一致
		def clean(self):
			password = self.cleaned_data.get('password')
			password1 = self.cleaned_data.get('password1')
			...
			return self.cleaned_data
	
	局部钩子
		eg:校验用户名中不能含有666
		def clean_username(self):
			username = self.cleaned_data.get('username')
			if '666' in username:
				self.add_error('username','光喊666是不行的')
			return self.username
   

5.额外的知识
	1.还支持正则校验
		username = forms.CharField(validator=[正则校验1,正则校验2,正则校验3])
	2.额外的框
		单选框
		多选框