35 django之Forms组件
一、form组件前戏
页面上获取用户输入的用户名和密码 然后判断用户名和密码是否符合一些条件 如果不符合则返回相应的提示信息 """ 自定义数据校验功能 主要步骤 1.搭建前端页面 标签渲染 2.校验数据是否合法 数据校验 3.返回相应的提示信息 提示信息 # 上述的三个步骤form组件都可以自动实现
views.py
def ab_form(request): error_dict={'user_msg':'',"pwd_msg":""} if request.method=='POST': username=request.POST.get("username") password=request.POST.get("password") if username=="jason": error_dict["user_msg"]="用户名格式不对" if len(password)==0: error_dict["pwd_msg"]="密码不能为空" return render(request,"ab_form.html",locals())
ab_form.html
二、form组件
1.基本定义/使用
views.py
# 与模型层类的定义相似 class MyForm(forms.Form): # username字段最短三位最长八位 username = forms.CharField(min_length=3, max_length=8) # password字段最短三位最长八位 password = forms.CharField(min_length=3, max_length=8) # email字段必须符合邮箱格式 email = forms.EmailField()
2.form组件数据校验功能
1.测试环境的准备 可以自己拷贝代码准备 2.其实在pycharm里面已经帮你准备一个测试环境 python console """ from app01 import views # 1 将带校验的数据组织成字典的形式传入即可 form_obj = views.MyForm({'username':'jason','password':'123','email':'123'})
# 2 判断数据是否合法 注意该方法只有在所有的数据全部合法的情况下才会返回True form_obj.is_valid() False
# 3 查看所有校验通过的数据 form_obj.cleaned_data {'username': 'jason', 'password': '123'}
# 4 查看所有不符合校验规则以及不符合的原因 form_obj.errors { 'email': ['Enter a valid email address.'] }
# 5 校验数据只校验类中出现的字段 多传不影响 多传的字段直接忽略 form_obj = views.MyForm({'username':'jason','password':'123','email':'123@qq.com','hobby':'study'}) form_obj.is_valid() True
# 6 校验数据 默认情况下 类里面所有的字段都必须传值 form_obj = views.MyForm({'username':'jason','password':'123'}) form_obj.is_valid() False """
1.在传递数据的时候 如果多传了额外字段 没有关系 form不校验
2.form组件内部定义的字段数据 默认都是必填的
可以通过修改参数required=False来控制是否必填
"""
3.form组件渲染标签
"""
1. 自动渲染的标签文本名称默认采用字段名首字母大写的形式,可以通过label参数自定义名称,如
username = forms.CharField(min_length=3,max_length=8,label='用户名')
2. forms组件只会自动帮你渲染获取用户输入的标签(input select radio checkbox),form只渲染获取用户数据的标签 不渲染提交按钮 需要我们自己编写
""" def index(request): # 1 直接生成一个不穿参数的form对象 form_obj = MyForm() # 2 直接将该空对象传递给html页面 return render(request,'index.html',locals()) # 前端利用空对象做渲染的标签的方式第一种渲染方式:代码书写极少,封装程度太高 不便于后续的扩展 一般情况下只在本地测试使用
{{ form_obj.as_p }} {{ form_obj.as_ul }} {{ form_obj.as_table }}
第二种渲染方式:可扩展性很强 但是需要书写的代码太多 一般情况下不用
{{ obj.username }}
#可实现按住姓名,光标自动跳到input框{{ form_obj.password.label }}:{{ form_obj.password }}
{{ form_obj.email.label }}:{{ form_obj.email }}
第三种渲染方式(推荐使用):代码书写简单 并且扩展性也高
{% for foo in form_obj %}
{{ foo }} # 融合了方式1和方式2的优势(推荐使用)
{% endfor %}
4.form组件提示信息
浏览器会自动帮你校验数据 但是前端的校验弱不禁风
如何让浏览器不做校验,添加novalidate,前端不校验数据