简单功能实现前端注册显示提示信息
思路分析:
通过在post请求中和get请求中同时定义一个字典
前端通过span标签站位(行级标签根据内部文本大小决定大小)
当发送时候符合检测返回前端的span中的模板语法值为空
当发送不符合检测时候则返回定义好的字符串
后端:
msg_dict = {'username': '', 'password': ' '}
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if 'sb' in username:
msg_dict['username'] = '账号中不能有sb'
if 'sb' in password:
msg_dict['password'] = '密码中也不能有sb'
return render(request, 'register.html', locals())
前端:
username: {{ msg_dict.username }}
password: {{ msg_dict.password }}
Forms组件简介
Forms介绍:
1.在Djang内部封装有很多的组件,他们有不同的功能
2.Forms主键就是主要负责检测的功能
3.Form主键其实就是帮助我们完成了如下的作用
Forms组件的作用
1.渲染前端页码 自动生成一些前端的代码
2.校验数据 后端自动判断数据正确与否
3.展示提示信息 如果不符合规范将会展示提示信息
校验数据:
1.前端也可校验数据,但是由于前端可以通过直接修改的方式操作数据,所有极其不安全
2.因此所有的数据一定要在后端再次检测
Forms组件的基本操作
from django import forms
class MyForm(forms.Form):
# 1.username设置的字符串类型最小为3最大为11
username = forms.CharField(min_length=3, max_length=11)
# 2.password设置的字符串类型最小为3最大为11
password = forms.CharField(min_length=3, max_length=11)
# 3.邮箱格式必须要@,而不像是models中实际为字符串
email = forms.EmailField()
Forms组件功能之校验数据
1.创建Forms组件对象
form_obj = MyForm(参数传入字典)
form_obj = views.MyForm({'username':'user','password':'12', 'email':'123'})
2.数据是否合法:只有全部数据合法才会返回true
form_obj.is_valid()
合法:true
非法:false
3.查看合法数据
form_obj.cleand_data
{'username': 'user'}
4.查看错误信息
form_obj.errors
返回错误信息是一个字典,字典的value值是列表形式
{'password': ['Ensure this value has at least 3 characters (it has 2).'], 'email': ['Enter a valid email address.']}
5.字典值传多了
不会影响判断:Form组件根据自定义的字段去字典中查相应的值,然后进行处理,对于无用信息直接进行处理
form_obj = views.MyForm({'username':'user','password':'123','email':'123@qq.com','hobby':'study'})
form_obj.is_valid()
True
6.字典值传少了
影响判断:(可以指定某字段可以为空)
Forms组件渲染标签(自动生产标签)
def register(requets):
form_obj = MyForm() # 定义空的对象,
return render(request, 'register.html', locals())
{{form_obj.as_ul}}
{{form_obj.as_table}}
{{form_obj.as_p}}
{{ form_obj.username.label }}:{{ form_obj.username }}
{{ form_obj.password.label }}:{{ form_obj.password }}
{{ form_obj.email.label }}:{{ form_obj.email }}
{% for form in form_obj %}
{{ form.label }}:{{ form }}
{% endfor %}
Forms组件前端展示提示信息
思路分析:与简单功能实现前端注册提示信息相似
1.由于在前端我们的input等标签都是由form_obj对象传过去所有在post内外都要定义一个相同的form_obj变量名对象,以确保前端数据的渲染
2.通过在POST内部将前端的数据放入form_obj中进行判断
3.如果合法注册成功
4.如果不合法将提示信息返回到前端
def register(request):
from_obj = MyForm()
if request.method == 'POST':
print(request.POST)
from_obj = MyForm(request.POST)
if from_obj.is_valid():
return HttpResponse('ok')
return render(request, 'ab_register.html', locals())
{% for form in from_obj %}
{{ form.label }}:{{ form }} {{ form.errors.0 }}
{% endfor %}
钩子函数HOOK
含义:钩子函数是指在特定的节点完成响应的操作
作用:能够让我们自定义检验规则
分类:
1.局部钩子 针对某个字段
2.全局钩子 针对多个字段
书写:
钩子函数在forms类中书写即可
def clean_username(self):
username = self.cleaned_data.get('username')
if 'ww' in username:
self.add_error('username', '是不能有这个名字滴')
return username
def clean(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if password != confirm_password:
self.add_error('confirm_password', '两次密码不一致')
return self.cleaned_data
forms组件相关参数以及补充知识点
1.label:给字段起名字
label:'账户'
2.error_messages:报错信息,要求字典格式
error_messages={
'invalid':'邮箱格式不正确',
'required': "邮箱不能为空"
}
3.max_length
4.min_length
5.initial
input框中的初始值
initial='张三'
6.validatots:在第一次检测时使用正则表达式
from django.core.validators import RegexValidator
class MyForm(Form):
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)枣庄看妇科医院哪里好 http://mobile.0632fkyy.com/
input的css和类型渲染
widget=forms.widgets.PasswordInput(attrs={'class':'form-control c1 c2'})
1.redioselect
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
pwd = forms.CharField(min_length=6, label="密码")
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.RadioSelect()
)
2.单选select
class LoginForm(forms.Form):
...
hobby = forms.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=3,
widget=forms.widgets.Select()
)
3.多选select
class LoginForm(forms.Form):
...
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
4.单选checkbox
class LoginForm(forms.Form):
...
keep = forms.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)
5.多选checkbox
class LoginForm(forms.Form):
...
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)
用户注册功能实现
def register(request)
pass