1.forms组件的基本使用
# 1.forms组件的基本使用 写一个基础的forms.Form的类 1、from app01 import views form_obj = views.LoginForm({'username':'koko','password':'123','email':12312}) 2.基本使用 1.将需要验证的数据 以字典的方式传递给自定的类 实列化参数对象 form_obj = views.LoginForm({'username':'koko','password':'123','email':12312}) 2.如何验证数据是否全部合法 form_obj.is_valid() # is_valid()是所有的字段必须都合法 才会显示为True 3. form_obj.errors # 查看错误原因 会一一匹配我们字典的vlue 和我们类中设置的限制条件做匹配 {'password': ['Ensure this value has at least 5 characters (it has 3).'], 'confirm_pwd': ['This field is required.'], 'email': ['Enter a valid email address.']} 4.显示正确字段 form_obj = views.LoginForm({'username':'koko','password':'123456','confirm_pwd':'123456','email':'12312@qq.com'}) form_obj.is_valid() # True 必须全部符合条件才会为真 5.注意: 1.自定义中所有的字段默认必须都是必须要传值的 一个都不能少 {'confirm_pwd': ['This field is required.'], 'email': ['Enter a valid email address.']} 2.form_obj.errors # 如果所有字段都是合法的 错误的字段返回是一个空字典{} 3.如果我们传入类中没有的字段则不会产生任何变化 form_obj.cleaned_data只会逐一对比我们类中有的字段 {'username': 'koko', 'password': '123456', 'confirm_pwd': '123456', 'email': '12312@qq.com'}
原理就是form_obj.error 会将我们实列化的字典的值 和我们字段一个个比对 逐一判断里面的属性 及限制条件 将不符合的字段存放到我们的errors {字典中} 将合法的字段的值存放 清洗后满足条件存放到cleaned_data 中 is_vail() 是个(布尔值)是检验所有的字典中的值符合条件才是True
2.forms组件前端渲染的三种方法
{#第一种#}
{#第一种#} {# {{ form_obj.as_p }}#} {#制动渲染封装性太高了 拓展性差#} {#都可以帮我们自动渲染输入框#} {# {{ form_obj.as_table}}#}
{#第二种#}
{#第二种#} {#可拓展性高但是书写太麻烦了#} {#form_obj.username 是一个框对象 form_obj.username.label 会将当前的类作为框的前显示的值#} {#{{ form_obj.username.label }}{{ form_obj.username }}#} {#{{ form_obj.password.label }}{{ form_obj.password }}#} {#{{ form_obj.email.label }}{{ form_obj.email }}#}
{#第三种推荐使用 form_obj 是一个类的空对象 没有进行传值#}
{#第三种 form_obj 是一个类的空对象 没有进行传值#} {#拓展行高 书写方便 foo 就是框对象 foo.label 会将当前类的字段首字母大写作为框的头名#} {#如何修改为汉字的呢 字段的属性设置#} {% for foo in form_obj %} <p>{{ foo.label }}{{ foo }}</p> {% endfor %}
注意事项
1.forms组件在帮你渲染页面的时候 只会渲染获取用户输入的标签 提交按钮需要你手动添加
2.input框的label注释 不指定的情况下 默认用的类中字段的首字母大写
2.forms检的登陆实例
前后端都要进行验证
前端也可以进行数据以及输入的数据是否合法 ,但是很容易通过爬虫进行修改 所以后端必须做检验
如何取消前端认证呢:
<form action="" method="post" novalidate> # 可以取消前端的认证
{% for foo in form_obj %}
<p>{{ foo.label }}{{ foo }}</p>
{% endfor %}
<input type="submit" value="提交 " >
</form>
前端models 代码 验证用户输入的位数和我们mdels 属性 提示展示信息
from django.shortcuts import render,HttpResponse,redirect from django import forms # Create your views here. # 1.forms组件基本使用 class LoginForm(forms.Form): username = forms.CharField(max_length=8, min_length=3,label='用户名', error_messages={'max_length':'用户名最大8位', 'min_length': '用户最少3位', 'required':'用户名不能为空'} ) password = forms.CharField(max_length=8, min_length=5,label='密码', error_messages={'max_length':'密码最大8位', 'min_length': '密码最少5位', 'required': '密码不能为空' } ) confirm_pwd = forms.CharField(max_length=8, min_length=5,label='再次检验密码', error_messages={ 'max_length': '用户名最大8位', 'min_length': '密码最少5位', 'required': '密码不能为空'}) email = forms.EmailField(label='邮箱', error_messages={ 'required': '密码不能为空', 'invalid':'邮箱格式不正确'})
后端逻辑代码
def login(request): # 传值前端渲染方式 # 1.用类是实例化一个空对像 form_obj = LoginForm() # 2.将空对象传给前端页面 # if request.method == 'POST': # username = request.POST.get('username') # password = request.POST.get('password') # confirm_pwd = request.POST.get('confirm_pwd ') # email = request.POST.get('email') #3 .接受全段传过来的数据 if request.method == 'POST': # 先通过类实例化 print(request.POST) form_obj = LoginForm(request.POST) # 4.验证数据 让forms组件帮我们去校验 if form_obj.is_valid(): pass # 5.如过全部验证合法则写入数据库 # else: #6. 反之不通过 像前端展示错误信息 return render(request,'login.html',locals())
前端显示代码
<form action="" method="post" novalidate> {% for foo in form_obj %} <p>{{ foo.label }}{{ foo }}</p> {# #foo.errors.0拿到对象的{} 报错信息 errors.0 是去除li 只要文本的内容#} <p style="color: red" >{{ foo.errors.0 }}</p> {% endfor %} <input type="submit" value="提交 " > </form> </body> </html>
报错信息的展示
{# #foo.errors.0拿到对象的{} 报错信息 errors.0 是去除li 只要文本的内容#}
<p style="color: red" >{{ foo.errors.0 }}</p>
4.钩子函数
已登录为实例
1.局部钩子 (验证客户是否密码一致)
# 钩子函数是在我们类下面的属于类方法 def clean_username(self): # 验证用户名中是否有不合法的敏感词汇 # 获取从前端输入的名字 然后后端接受 所有的符合类里面的数据会缓存到cleaned_data {[],[]} 中 username = self.cleaned_data.get('username') if '666' in username: self.add_error('username','不能有666这么捞的字眼') return username
2.全局钩子(所以字段)
后端代码
# 全局钩子(针对多个字段做额外的校验) 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
前端展示全局钩子的校验 证人密码的密码属性我没有加主要为了验证
5.froms 组件的其他字段操作
1.核心必会字段
required 是否必填默认True 可以改为False
label 显示注释信息 显示框外的头名
error_messages= {'key':'value'} 报错信息
initial 初始化默认值
widget 控制标签属性和样式
widgte = widgets.PasswordIput() 隐藏密码
控制标签属性
widget=widgets.PasswordInput(attrs={'class':'form-control c1 c2','username':'jason'})
其他字段了解知识点(知道有这些对象 需要用到的时候 能够知道去哪找)
2.了解字段
其他字段了解知识点(知道有这些对象 需要用到的时候 能够知道去哪找) # 单选的radio框 gender = forms.ChoiceField( choices=((1, "男"), (2, "女"), (3, "保密")), label="性别", initial=3, widget=forms.widgets.RadioSelect() ) # 单选select hobby = forms.ChoiceField( choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), label="爱好", initial=3, widget=forms.widgets.Select() ) # 多选的select框 hobby1 = forms.MultipleChoiceField( choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), label="爱好", initial=[1, 3], widget=forms.widgets.SelectMultiple() ) # 单选的checkbox keep = forms.ChoiceField( label="是否记住密码", initial="checked", widget=forms.widgets.CheckboxInput() ) # 多选的checkbox hobby2 = forms.MultipleChoiceField( choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), label="爱好", initial=[1, 3], widget=forms.widgets.CheckboxSelectMultiple() )