django组件
目录
django内置序列化组件
在实际工作中一般前后端都是分离的,后端只需要考虑到给前端返回json格式的数据。 格式应该是:{1:{},2:{},3:{}}
1.自己手撸
from app01 import models
from django.http import JsonResponse
def ab_ser_func(request):
# 1.查询所有的书籍对象
book_queryset = models.Book.objects.all() # queryset [对象、对象]
# 2.需要手动写封装成大字典返回
data_dict = {}
for book_obj in book_queryset:
temp_dict = {}
temp_dict['pk'] = book_obj.pk
temp_dict['title'] = book_obj.title
temp_dict['price'] = book_obj.price
temp_dict['info'] = book_obj.info
data_dict[book_obj.pk] = temp_dict # {1:{},2:{},3:{},4:{}}
return JsonResponse(data_dict)
序列化组件方法
def ab_ser_func(request):
# 1.查询所有的书籍对象
book_queryset = models.Book.objects.all()
from django.core import serializers
res = serializers.serialize('json',book_queryset) # 自动帮我们处理
return HttpResponse(res)
批量操作数据
我们往一个表里插入大量的数据eg:10w条,那么速度是相当的慢。效率极低. ORM提供了快速插入数据的方法。
"""
bulk_create 批量插入数据
bulk_update 批量修改数据
"""
def ab_bk_func(request):
book_obj_list = [] # 定义一个空列表
for i in range(1, 100000):
book_boj = models.Book(title='第%s本书'% i) # 产生一个book对象并指定对象title的名字
book_obj_list.append(book_boj) # 把对象添加到列表里
models.Book.objects.bulk_create(book_obj_list) # 使用bulk_create 批量添加列表内对象
book_queryset = models.Book.objects.all()
return render(request,'bkpage.html',locals())
自定义分页器的使用
django自带的分页器模块自己编写起来太麻烦,所以有封装好的。
了解详情请点击
https://www.cnblogs.com/Dominic-Ji/articles/12035722.html
form组件
简单校验
获取用户数据并发送给后端校验 input框输入校验,返回错误信息。
form组件
1.自动校验数据
2.自动生成标签
3.自动展示信息
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8) # username字段最少3个字符最大8个字符
password = forms.CharField(min_length=6,max_length=20)
age = forms.IntegerField(min_value=0,max_value=100) # 最小年龄为0 最大年龄为100
email= forms.EmailField()
#1.先产生一个对象
form_obj = MyForm()
# 2. 添加数据
form_obj = views.MyForm({'username':'tank','password':'123456','age':18,'email':'123'}) #故意把 email 输错
# 3.判断数据是否全部符合要求
form_obj.is_valid() # 因为email 错了返回 False
"返回的是 True False"
# 4.获取符合校验条件的数据
form_obj.cleaned_data
{'username': 'tank', 'password': '123456', 'age': 18}
# 5.获取不符合条件的数据
form_obj.errors
{'email': ['Enter a valid email address.']}
我们在添加数据的时候会自动拿去跟我们设置的字段的条件做比对,如果符合 放在cleaned_data 内,不符合则放在errors内。
注意:
"""
1.只校验我们编写的类里出现的字段,多传的没有任何操作
2.默认情况下类中定义好的字段都是必填的,不然就是false
"""
代码 | 功能 |
---|---|
is_valid() | 判断数据是否全部符合要求 |
cleaned_data | 获取符合校验条件的数据 |
errors | 获取不符合条件的数据 |
forms组件
渲染标签
我们编写好一个Form类后产生一个form对象,然后把form对象返回到前端此时就可以通过.的方式自动生成标签。标签的数量根据Form类里的字段数量而决定
Form类
class MyForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8)
age = forms.IntegerField(min_value=0,max_value=200)
email = forms.EmailField()
"给字段参数+label 可以修改前端显示的input框的名字"
def ab_forms_func(request):
# 1.产生一个空对象
form_obj = MyForm()
return render(request,'formpage.html',locals())
前端语法:
方式一:
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
{{ form_obj.as_table }}
好处:一次性渲染标签
坏处: 封装程度过高扩展性差
"一般用户自己测试"
方式二:
{{ form_obj.username.label }} # 获取到字段username里的label
{{ form_obj.username }}
字段多的情况下要写很多太麻烦
方式三:(最好用)
封装程度较高,扩展性高
{% for form in form_obj %}
{{ form.label }} # 字段的label
{{ form }} # 字段
{% endfor %}
"forms组件只帮助我们渲染获取用户数据的标签,别的标签需要我们自己填写"
eg:
form 标签 提交按钮
form 标签属性
<form action="" novalidate> 取消前端校验
展示信息
可以帮我们反馈一些信息给前端显示给用户看
def ab_forms_func(request):
# 1.产生一个空对象
form_obj = MyForm()
if request.method =='POST':
form_obj = MyForm(request.POST) # request.POST可以看出是一个字典 传给froms类校验
if form_obj.is_valid(): # 检验数据是否合法
print(form_obj.cleaned_data)
else:
print(form_obj.errors)
return render(request,'formpage.html',locals())
前端
<form action="" method="post"novalidate >
{% for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
<span>{{ form.errors.0 }}</span> # .0只拿标签里的文本
</p>
{% endfor %}
<input type="submit" value="提交">
</form>
错误信息的提示也可以变成中文
方式1:自定义内容
给字段对象添加errors_messages参数
username = forms.CharField(min_length=3, max_length=8, label='用户名',
error_messages={
'min_length': '用户名最少三个字符',
'max_length': '用户名最多八个字符',
'required': '用户名不能为空'
}
)
方式2:修改系统语言环境
from django.conf import global_settings
进入global_settings 内可以查看到各国语言对应的代码
LANGUAGE_CODE = 'en-us' # 修改settings内的
校验补充
1.直接字段内填写参数 max_length
2. 使用正则表达式
from django.core.validators import RegexValidator
class MyForm(forms.Form):
tel = forms.CharField(
validators=[
RegexValidator(r"[0-9]", "电话号码必须是数字"), # 第一个参数正则,第二个参数是提示信息
RegexValidator(r"^[0-9]{3}-[0-9]{4}|[0-9]{8}-[0-9]{7}", "不是国内号码") # 可以写多个正则判别
]
钩子函数
在字段所有的校验参数之后触发。
编写代码自定义校验规则 "钩子函数需要写在Forms类中"
局部钩子 "每次只校验一个字段数据"
def clean_username(self):
username = self.cleaned_data.get('username') # 基于前两次校验后 符合规则的数据会存放与cleaned_data中
if username == 'tank':
self.add_error('username','用户tank已存在')
return username # 钩出来用之后 要还回去
全局钩子 "一次性校验多个字段数据"
def clean(self): # 钩取全局数据 一次性可以校验多个数据
password = self.cleaned_data.get('password')
pwd = self.cleaned_data.get('pwd')
if not password == pwd:
self.add_error('pwd','两次密码不一致')
return self.cleaned_data # 返回所有数据
form参数补充
min_length | 字符最小长度 | |
---|---|---|
max_length | 字符最大长度 | |
min_value | 数字最小值 | |
max_value | 数字最大值 | |
label | 字段标签名称 | 模板语法 {{ 表单字段对象.label }} |
error_messages | 错误提示 | 可以自定义限制条件的报错信息 |
validators | 正则校验 | |
initial | 默认值 | 给字段添加默认值就是input框的默认值 |
required | 必填项 | 给字段添加是否必填 默认为True |
widget | 属性设置 | 需要确定标签类型,在forms.widgets有封装 |
error_messages
username = forms.CharField(max_length=8, min_length=2,
error_messages={
'max_length': "啊 长了", # 针对某些限制条件,来自定义错误信息
'min_length': "啊 短了",
}
)
initial
字段没有传值则标签value属性等于这个值,即输入框中的默认值
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值
)
pwd = forms.CharField(min_length=6, label="密码")
widget
from django.forms import widgets
username = forms.CharField(max_length=8, min_length=2,
widget=forms.widgets.TextInput(attrs={'class': 'form-control', 'username': '自定义属性'})
)
class 如果有多个空格隔开。
password = forms.CharField(min_length=3,max_length=8,label='密码',
widget = forms.widgets.PasswordInput())
# type =‘password’ 密文
modelforms组件
在models表写入数据之前进行数据校验
from django import forms
from app01 import models
class MyModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo # 指定表
fields = '__all__' # 对表中所有字段进行校验
labels = {
"title": "书名",
"price": "价格"
} # 设置input框的名字
widgets = {
"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),
}
def ab_mf_func(request):
modelform_obj = MyModelForm()
if request.method == 'POST':
modelform_obj = MyModelForm(request.POST)
if modelform_obj.is_valid():
modelform_obj.save() # 新建数据
else:
print(modelform_obj.errors)
return render(request,'formpage.html',locals())
form_obj = MyModelForm(request.POST, instance=edit_obj) # 可以通过instance传一个对象
form_obj.save() # 此时save 就会变成update