django框架八
作者:互联网
- 批量操作数据
- 自定义分页器(重在思路)
- form组件
- modelform组件
- cookie与session简介
批量操作数据
浏览器访问一个django路由 立刻创建10万条数据并展示到前端页面
create()、all()
涉及到大批量数据的创建 直接使用create可能会造成数据库崩溃
批量数据创建>>>:bulk_create()
批量数据修改>>>:bulk_update()
def index(request):
# book_list = []
# for i in range(100000):
# book_obj = models.Book(title=f'第{i}本')
# book_list.append(book_obj)
"""列表生成式"""
# models.Book.objects.bulk_create(book_list) # 批量创建
book_query = models.Book.objects.filter() # 查询所有数据
return render(request, 'book_list.html', locals())
批量数据展示
当数据量比较大的时候 页面展示应该考虑分页
1.QuerySet切片操作
2.分页样式添加
3.页码展示
如何根据总数据和每页展示的数据得出总页码
divmod()
4.如何渲染出所有的页码标签
前端模板语法不支持range 但是后端支持 我们可以在后端创建好html标签然后传递给html页面使用
5.如何限制住展示的页面标签个数
页码推荐使用奇数位(对称美) 利用当前页前后固定位数来限制
6.首尾页码展示范围问题
"""
上述是分页器组件的推导流程 我们无需真正编写
django自带一个分页器组件 但是不太好用 我们自己也写了一个
"""
自定义分页器
from app01.plugins import mypage # 导一个自定义模块
book_query = models.Book.objects.all()
page_obj = mypage.Pagination(current_page=request.GET.get('page'),
all_count=book_query.count()
) # 传两个参数即可
page_query = book_query[page_obj.start:page_obj.end] # 开始对象和结束对象
return render(request, 'bookList.html', locals()) # 返回一个页面
{% for book_obj in page_query %}
<p class="text-center">{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}
form组件
1.初始阶段
后端:
def form(request):
data_dict = {'username': '', 'pwd': ''} # 定义字典传到前端
if request.method == 'POST':
name = request.POST.get('username')
pwd = request.POST.get('password')
if name == 'jason':
data_dict['username'] = '你不能使用jason' # 通过post请求传来的数据进行判断然后修改字典再次传到前端直接使用即可
if pwd == '123':
data_dict['pwd'] = '密码不能使用123'
print(data_dict)
return render(request, 'form.html', locals())
前端:
form action="" method="post">
<p>
username<input type="text" name="username">
<span style="color: red">{{ data_dict.username }}</span>
</p>
<p>
password<input type="text" name="password">
<span style="color: red">{{ data_dict.pwd }}</span>
</p>
<input type="submit" value="提交">
</form>
2.form组件
1.数据校验
支持提前设置各种校验规则 之后自动校验
2.渲染页面
支持直接渲染获取用户数据的各种标签
3.展示信息
支持针对不同的校验失败展示不同的提示
创建form类
from django import forms
class MyForm(forms.Form):
name = forms.CharField(max_length=7, min_length=3) # name字段最少3位最多7位
pwd = forms.CharField(max_length=8, min_length=3) # pwd最少三位
email = forms.EmailField() # 限制邮箱
1.数据校验功能
1.1.传递待校验的数据
form_obj = views.MyForm({'name':'jason','age':18,'email':123})
1.2.判断所有的数据是否符合校验
form_obj.is_valid()
1.3.获取符合校验规则的数据
form_obj.cleaned_data
{'name': 'jason', 'age': 18}
1.4.查阅不符合校验规则的数据及错误原因
form_obj.errors
{'email': ['Enter a valid email address.']}
"""
1.form类中编写的字段默认都是必填的 少传则肯定通不过校验 is_valid
2.校验如果多传了一些字段 则不参与校验 全程忽略
"""
2.渲染标签
2.1产生一个对象
def func(request):
form_boj = MyForm()
return render(request,'func.html',locals())
2.2
<form action="">
{#模版语法自带注释#}
{# 第一种 封装贼高扩展性差#}
{# {{ form_boj.as_p }}#}
{# 第二种封装低很麻烦#}
{# {{ form_boj.name.label }}{{ form_boj.name }}#}
{# {{ form_boj.pwd.label }}{{ form_boj.pwd }}#}
{% for form in form_boj %}
{{ form.label }}{{ form }}
{% endfor %}
<input type="submit" value="提交">
</form>
3.展示提示信息
form 表单取消前端校验加novalidate参数即可
提示信息修改参数
class MyForm(forms.Form):
name = forms.CharField(max_length=7, min_length=3,
error_messages={'max_length': '用户名最多7位',
'min_length':'用户名最少为3位',
'required':'用户名不能为空'}) # name字段最少3位最多7位
pwd = forms.CharField(max_length=8, min_length=3) # pwd最少三位
email = forms.EmailField(error_messages={'invalid':'邮箱格式不正确'}) # 限制邮箱
{% for form in form_boj %}
<p>{{ form.label }}{{ form }}
<span style="color: red">{{ form.errors.0 }}</span> # errors是一个列表
</p>
{% endfor %}
<input type="submit" value="提交">
组件参数
重要的字段参数
max_length、min_length
max_value、min_value
label 字段注释
label ='字段名'
error_messages 错误提示
required 是否为空
widget 标签类型、标签属性
widget=forms.widgets.TextInput(attrs={'class':'form-control'})
initial 默认值
validators 正则校验
狗子函数
简介:提供自定义的校验方式类似于将数据拿出校验之后还回去
单个字段:
def clean_name(self):
name = self.cleaned_data.get('name')
res = models.User.objects.filter(name=name)
if res:
self.add_error('name', '%s已存在' % name)
return name # 返回name字段数据
多个字段
def clean(self):
pwd = self.cleaned_data.get('pwd')
confirm_pwd = self.cleaned_data.get('confirm_pwd')
if not pwd == confirm_pwd:
self.add_error('confirm_pwd','密码不一致')
return self.cleaned_data # 返回所有的数据
##################################################################################
'''form组件代码校验完整代码'''
from django import forms
class MyForm(forms.Form):
name = forms.CharField(max_length=7, min_length=3,
error_messages={'max_length': '用户名最多7位',
'min_length': '用户名最少为3位',
'required': '用户名不能为空'},
initial='jason',
widget=forms.widgets.TextInput(attrs={'class': 'form-control'})) # name字段最少3位最多7位
pwd = forms.IntegerField() # pwd最少三位
confirm_pwd = forms.IntegerField()
email = forms.EmailField(error_messages={'invalid': '邮箱格式不正确'},
) # 限制邮箱
# 校验用户名是否存在
def clean_name(self):
name = self.cleaned_data.get('name')
res = models.User.objects.filter(name=name)
if res:
self.add_error('name', '%s已存在' % name)
return name
# 校验两次用户名是否一致
def clean(self):
pwd = self.cleaned_data.get('pwd')
confirm_pwd = self.cleaned_data.get('confirm_pwd')
if not pwd == confirm_pwd:
self.add_error('confirm_pwd','密码不一致')
return self.cleaned_data
def func(request):
form_boj = MyForm()
if request.method == 'POST':
form_boj = MyForm(request.POST)
if form_boj.is_valid(): # 判断是否所有数据符合
res = form_boj.cleaned_data
print(res)
models.User.objects.create(**res) # 所有校验成功后将数据写入数据库将字典打散成k=v写入数据库
else:
print(form_boj.errors) # 错误的数据
return render(request, 'func.html', locals())
modelform组件
class MyModelForm(forms.ModelForm):
class Meta:
model = models.User
fields = '__all__'
def clean_name(self):
name = self.cleaned_data.get('name')
res = models.User.objects.filter(name=name)
if res:
self.add_error('name', '%s已存在' % name)
return name
def model_form(request):
model_form_obj = MyModelForm()
if request.method == 'POST':
model_form_obj = MyModelForm(request.POST)
if model_form_obj.is_valid():
model_form_obj.save() # 保存
return render(request, 'model_form.html', locals())
修改
def model_form(request):
model_form_obj = MyModelForm()
if request.method == 'POST':
edit_obj = models.User.objects.filter(name='jason').first() # 先获取修改的对像可以将条件通过其他方法传过来类似get请求或者ajax
model_form_obj =MyModelForm(request.POST,instance=edit_obj) # 将对象传到form对象中
if model_form_obj.is_valid():
model_form_obj.save() # 修改
return render(request, 'model_form.html', locals())
标签:obj,name,form,request,校验,django,框架,pwd 来源: https://www.cnblogs.com/tzmy/p/16671014.html