form组件
# 1.form组件支持提前设置各种检验规则,之后自动校验
# 2.form组件可以支持直接渲染用户数据的各种标签
# 3.form组件支持针对不同的校验失败展示不同的提示
# 4.form组件的使用
- 1. 创建form类型
from django import forms
class MyForm(forms.Form):
name = forms.CharField(max_length=8, min_length=3) # 用户名最长八个字符 最短三个字符
age = forms.IntegerField(max_value=150, min_value=0) # 年龄最小0岁 最大150岁
email = forms.EmailField() # 邮箱必须符合邮箱格式(至少有个@符号)
- 2. 数据校验功能
# 1.传递待校验的数据
form_obj = views.MyForm({' name ' :' jason ' ,' age ' :18,' email ' :123})
# 2.判断所有的数据是否符合校验
form_obj.is_valid()
# 3.获取符合校验规则的数据
form_obj.cleaned_data
{ ' name ' : ' jason ' , ' age ' : 18}
# 4.查阅不符合校验规则的数据及错误原因
form_obj.errors
{ ' email ' : [' Enter a valid email address. ' ]}
"""
1.form类中编写的字段默认都是必填的,少传则肯定通不过校验 is_valid
2.校验如果多传了一些字段 则不参与校验 全程忽略
"""
- 3. 渲染标签功能
# 1.方式1(封装程度高 扩展性差)
{{ form_obj.as_p }}
{{ form_obj.as_table }}
{{ form_obj.as_ul }}
# 2.方式2(封装程度低 扩展性好 编写困难)
{{ form_obj.name.lable }}
{{ form_obj.name }}
# 3.方式3(推荐使用)
{% for form in form_obj %}
<p>{{ form.label }}{{ form }}</p>
{ % endfor %}
"""
类中以外的所有标签都不会自动渲染 需要自己编写
"""
- 4. 展示提示信息
-1.form表单如何取消浏览器自动添加的数据校验功能
前端:
<form action="" method=" post " novalidate>
{ % for form in form_obj %}
<p>
{{ form.label }}{{ form }}
<span style=" color: red; " >
{{ form.errors.0 }}
</span>
</p>
{ % endfor %}
<input type=" submit " value=" 提交 " >
后端:
def func(request):
form_obj = MyForm()
if request.method == ' POST ' :
form_obj = MyForm(request.POST)
if form_obj.is_valid():
print (form_obj.cleaned_data)
return render(request,' func.html ' ,locals())
forms组件渲染标签
# 1.form组件渲染标签的三种方式
后端:
from django import forms
class Myforms(forms.Form):
username = forms.CharField(min_length=3,max_length=8,)
age = forms.IntegerField(min_value=1,max_value=150)
email = forms.EmailField()
def ab_from_func(request):
form_obj = Myforms()
return render(request,' Page.html ' ,locals())
方式一:
<p>forms组件渲染标签的方式1(封装程度过高 扩展性差 主要用于本地测试):</p>
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
{{ form_obj.as_table }}
方式二:
<p>forms组件渲染标签的方式2(封装程度过低 扩展性高 编写麻烦)</p>
{{ form_obj.username.label }}
{{ form_obj.username }}
{{ form_obj.age.label }}
{{ form_obj.age }}
{{ form_obj.email.label }}
{{ form_obj.email }}
方式三:
<p>forms组件渲染标签的方式3(封装程度较高 扩展性高 编写简单 推荐使用)</p>
{ % for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
</p>
{ % endfor %}
"""
form组件只负责渲染获取用户数据的标签,所以对于标签和按钮都需要自己手动编写
在使用form组件时,可以直接取消前端帮我们校验
<form action="" novalidate>
"""
forms组件展示信息
# 1.后端不同请求返回的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(): # 校验数据是否合法
print (form_obj.cleaned_data)
else :
print (form_obj.errors)
# 将该对象传递给html文件
return render(request, ' formsPage.html ' , locals())
前端:
{ % for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
<span>{{ form.errors.0 }}</span>
</p>
{ % endfor %}
# 2.针对错误信息的提示可以修改成各国语言
# 方式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 django内部真正的配置文件
forms组件校验补充
# forms组件针对字段数据的校验 提供了三种类型的校验方式(可以一起使用)
第一种类型:直接填写参数 max_length
第二种类型:使用正则表达式 validators
第三种类型:钩子函数 编写代码自定义校验规则
# 1.局部钩子:检验单个字段
代码分析:
def clean_name(self):
name = self.cleaned_data.get(' name ' )
res = models.User.objects.filter(name=name).first()
if res:
return self.add_error(' name ' ,' 用户名已存在 ' )
return name
# 2.全局钩子:检验多个字段
代码分析:
def clean(self):
pwd = self.cleaned_data.get(' pwd ' )
confirm_pwd = self.cleaned_data.get(' confirm_pwd ' )
if not pwd == confirm_pwd:
return self.add_error(' confirm_pwd ' ,' 两次密码不一致 ' )
return self.cleaned_data
forms组件参数补充
# 5. 一些重要的字段参数
max_length、min_length
max_value、min_value
label # 字段注释
error_messages # 错误提示
required # 否为空
widget # 标签类型、标签属性
initial # 默认值
validators # 正则校验
required # 是否必填
widget # 控制标签的各项属性
"""
widget=forms.widgets.PasswordInput(attrs={'class': 'form-control', 'username': 'jason'})
"""
forms组件源码剖析
modelform组件
# 1.modelform是form的优化版本,使用更简单,但是功能更强。
class MyModelForm(forms.ModelForm):
class Meta:
model = models.User
fields = ' __all__ '
def clean_name(self):
name = self.cleaned_data.get(' name ' )
res = models.User.objects.filter(name=name).first()
if res:
self.add_error( ' name ' ,' 用户名已存在 ' )
return name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律