目录
forms组件
forms组件简介
小需求:获取用户数据并发送给后端校验 后端返回不符合校验规则的提示信息
form组件
1.自动校验数据
2.自动生成标签
3.自动展示信息
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3, max_length=8) # username字段最少三个字符最大八个字符
age = forms.IntegerField(min_value=0, max_value=200) # 年龄最小0 最大200
email = forms.EmailField() # 必须符合邮箱格式
校验数据的功能(初识)
form_obj = views.MyForm({'username':'jason','age':18,'email':'123'})
form_obj.is_valid() # 1.判断数据是否全部符合要求
False # 只要有一个不符合结果都是False
form_obj.cleaned_data # 2.获取符合校验条件的数据
{'username': 'jason', 'age': 18}
form_obj.errors # 3.获取不符合校验规则的数据及原因
{'email': ['Enter a valid email address.']}
1.只校验类中定义好的字段对应的数据,多传的不做任何操作
2.默认情况下类中定义好的字段都是必填的
forms组件渲染标签
1.首先定义一个forms类
from django import forms
class Myform(forms.Form):
username = forms.CharField(min_length=3, max_length=8) # 最少三位,最大八位
age = forms.IntegerField(min_value=0, max_value=200) # 数字不能小于0,不能大于200
email =forms.EmailField() # 邮箱格式
2.建立视图函数
def ab_forms_func(request):
# 产生一个空对象
form_obj = MyForm()
# 将产生的空对象传递给html文件
return render(request, 'html文件', locals())
3.在html文件中渲染标签
方式一:
{{ form_obj.as_p }} # 页面上会自动列出对应的字段名以及输入框(以p标签的形式)
{{ form_obj.as_ul }} # 以ul标签的方式
{{ form_obj.as_table }} # 以table标签的方式
会直接渲染出所有的字段名,封装程度高,但是扩展性差,主要用于本地测试,实际项目基本不用
方式二:
{{ form_obj.username.lable }}
{{ form_obj.username }} # 页面中的写法是两个紧挨着,实际效果是会自动渲染出绑定了lable标签的username输入框
封装程度低,扩展性高,但是编写比较麻烦,实际项目中也不怎么使用
方式三:渲染出的实际效果与方式二一样,但是编写比方式二简单
{% for form in form_obj %}
<p>
{{ form.lable }}
{{ form }}
</p>
{% endfor %}
注意事项:
1.forms组件只负责渲染获取用户数据的标签,其余的form标签与按钮都需要我们自己写
2.前端自带校验但是可以被修改,所以我们在使用forms组建的时候可以直接取消前端的校验,统一由后端校验
<form action="" novalidate> # 取消前端校验
forms组件展示信息
当我们输入的数据不符合规范时,需要给前端一个提示或者说需要将错误信息在前端展示出来
后端代码:
def ab_forms_func(request):
form_obj = MyForm() # 产生一个空对象
if request.method = 'POST':
form_obj = MyForm(request.POST) # request.POST可以看成是一个字典,直接传给forms校验
if form_obj.is_valid(): # 校验数据是否合法,合法的数据会放到cleaned_data中,不合法的放到errors中,其它多余的数据不管
print(form_obj.cleaned_data)
else:
print(form_obj.errors)
return render(request, 'html文件', locals()) # 如果前端返回的是POST请求则将if中的form_obj返回给前端,否则返回第一个form_obj,所以两个form_obj虽然不一样,但是名字得一样
前端代码:
{% for form in form_obj %}
<p>
{{ form.lable }}
{{ form }}
<span>{{ form.errors.0 }}</span>
</p>
{% endfor %}
正常情况下页面上显示的错误信息为英文,我们可以将它修改为各国语言
方式一:自定义
我们在定义字段对象的时候可以给字段对象添加一个errors_messages参数
username = forms.CharField(min_length=3, max_length=8, errors_messages={
'min_length': '用户名最少三个字符',
'max_length': '用户名最多八个字符',
'required': '用户名不能为空'
})
添加过errors_messages参数以后传递给前端的错误信息就会直接从这里面拿取
方式二:修改系统语言环境
在settings配置文件中有一个参数是用来控制系统语言的 LANGUAGE_CODE = 'en-us' 默认为英文
from django.conf import global_settings # global_settings是Django内部真正的配置文件,我们可以配置的系统环境语言在里面都能看到
forms组件校验补充
forms组件针对字段数据的校验提供了三种类型的校验方式(三种校验方式可以一起使用)
1.直接填写参数
2.使用正则表达式
首先导入一个正则校验模块 form django.core.validators import RegexValidator
正则校验导入以后就可以使用validators参数来编写正则校验
phone = forms.CharField(validators=[RegexValidator(r'^[0-9]+$', '请输入数字')]) # 第一个是正则表达式,第二个是不符合正则校验返回的内容
3.使用钩子函数,编写代码自定义校验规则
钩子函数是在is_valid之后触发的,在经过前两个校验方式之后,合法的数据已经进入到了cleand_data中,钩子函数就相当于做一个额外的校验,如果说前两个校验是对数据的外表进行校验的话,那么钩子函数就是对数据的内在进行校验
钩子函数也分为两个一个是局部钩子,一个是全局钩子
局部钩子是每次只校验一个字段数据,而全局钩子一次可以校验多个字段数据
局部钩子:
def clean_username(self):
username = self.cleaned_data.get('username')
if username == 'jason':
self.add_error('username', '用户名jason已存在')
return username # 局部钩子返回的是字段数据
全局钩子:
def clean(self):
password = self.cleaned_data.get('password')
confirm_pwd = self.cleaned_data.get('confirm_pwd')
if not password == confirm_pwd:
self.add_error('confirm_pwd', '两次密码不一致')
return self.cleaned_data # 全局钩子返回的是cleaned_data
forms组件补充
min_length 最小字符
max_length 最大字符
min_value 最小值
max_value 最大值
lable 字段注释
error_messages 错误提示
validators 正则校验器
initial 默认值
给字段添加默认值
required 是否必填
正常情况下该参数默认为True,如果我们要让某一个字段变为可不填,则将该字段的required参数改为False
widget 用来控制标签的各项属性
1.比如说CharField正常情况下默认的是type="text",由于是forms组件渲染的,没地方修改,因此如果我们想修改type属性的话就需要用到widget
具体用法:
widget=forms.widgets.PasswordInput() # type属性改为password
2.还可以修改标签样式
widget=forms.widgets.PasswordInput(attr={'class': 'form-control', 'username': 'jason'})
跟多可以参考https://www.cnblogs.com/Dominic-Ji/p/9240365.html
modelform组件
就是form与model模型层的结合
from django import forms
from app01 import models
class MyModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo # 选择对哪张表做数据校验
fields = '__all__' # 表中所有字段都校验
labels = {
'username':'用户名'
} # 字段的名称
使用:
def ab_mf_func(request):
modelform_obj = MyModelForm()
if request.method == 'POST':
modelform_obj = MyModelForm(request.POST,instance=User_obj)
if modelform_obj.is_valid():
modelform_obj.save() # 将校验过的数据保存到数据库中
else:
print(modelform_obj.errors)
return render(request, 'modelFormPage.html', locals())
Django中间件
中间件主要用于网站访问频率的校验、用户权限的校验等全局性的功能需求
Django中间件默认有七个,同时也支持用户自定义中间件
Django默认的七个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定义中间件
1.创建一个存储自定义中间件代码的py文件或目录
2.参考默认中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
1.process_request
1.请求来的时候会从上往下依次经过每一个注册过的中间件里面的该方法,如果没有则跳过
2.如果该方法自己返回了一个HttpResponse对象,那么程序不再往后面的中间件走了,而是直接原路返回
2.process_response
1.响应走的时候是从下往上依次经过每一个注册过的中间件里面的该方法,如果没有则跳过
2.该方法有两个形参request和reponse,形参response指代的是后端想要返回给前端的数据,该方法必须返回形参,可以替代
3.process_view
4.process_exception
5.process_template_response
4.自定义的中间件需在配置文件中注册才能生效
标签:username,obj,form,校验,forms,组件
From: https://www.cnblogs.com/zyg111/p/16997267.html