列表添加元素的方式
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.额外的框
单选框
多选框