Django 中的form组件实现了如下的功能
1、生成页面可用的HTML标签
2、对用户提交的数据进行校验
3、保留上次输入内容
使用form组件步骤
(1)、导入form组件:from django improt forms
(2)、编写类继承 form.Forms
(3)、创建对象
(4)、生成页面
代码:
#1、导入form组件
from django import forms
#2、编写类 继承forms.Form
class UserForm(forms.Form):
"""
username、pwd 属性:对应页面中的label标签中显示的内容
label 属性:用来修改label标签中显示的内容
"""
username = forms.CharField(label='用户名')#生成用户名输入框
pwd = forms.CharField(label='密码')#生成密码输入框
def register_form1(request):
#3、创建对象
user_form = UserForm()
return render(request,'app01/register_form.html',{'user_form':user_form})
#{'user_form':user_form} 给register_form.html传输数据
#4生成页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form组件</title>
</head>
<body>
{# 生成表单输入框 #}
{{ user_form.as_p }}
{# {{ user_form.as_ul }} #}
{#{{ user_form.as_table }}#}
</body>
</html>
效验输入信息
#2、编写类 继承forms.Form
class UserForm(forms.Form):
"""
username、pwd 属性:对应页面中的label标签中显示的内容
label 属性:用来修改label标签中显示的内容
"""
# 生成用户名输入框
username = forms.CharField(
label='用户名',
required=True, # 输入不能为空
min_length=2, # 长度至少2位
error_messages={ #修改错误信息
'required': '不能为空',
'min_length': '至少2位'
}
)
# 生成密码输入框
pwd = forms.CharField(
label='密码',
required=True,
min_length=6,
error_messages={
'required':'不能为空',
'min_length':'至少6位'
}
)
def register_form1(request):
#3、创建对象
user_form = UserForm()
# 判断提交类型
if request.method == 'POST':
#将表单上验证的消息封装成user_form中进行校验
user_form = UserForm(request.POST)
return render(request,'app01/register_form.html',{'user_form':user_form})
#{'user_form':user_form} 给register_form.html传输数据
优化页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form组件</title>
</head>
<body>
{#novalidate :去掉表单效验,因为自动生成的标签自动添加了 required 属性#}
<form action="" method="post" novalidate>
{% csrf_token %}
{% comment %}
1、user_form 是UserForm类的对象
2、user_form.username :user_form 调用username 属性
3、user_form.username.lable : username 也是一个对象,username.label调用feild对象中的label 属性
{{ user_form.username.label }} :{{ user_form.username }}
4、user_form.username.label_tag :加上_tag就是自动添加:而不用手动来添加:
5、user_form.username.errors.0
注意 : 一定要加.0 因为user_form.username.errors 是一个列表
若是不加的话 就会自动生成无序列表展示在页面上
{% endcomment %}
{{ user_form.username.label_tag }} {{ user_form.username }} <span style="color: red">{{ user_form.username.errors.0 }}</span><br/>
{{ user_form.pwd.label_tag }} {{ user_form.pwd }} <span style="color: red">{{ user_form.pwd.errors.0 }}</span><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
保存数据库
models.py
#创建User模型
class User(models.Model):
username = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
def __str__(self):
return 'username : {}'.format(self.username)
生成迁移文件表格 链接地址
makemigrations
migrate
视图函数中
# 导入models
from app01 import models
def register_form1(request):
#3、创建对象
user_form = UserForm()
# 判断提交类型
if request.method == 'POST':
#将表单上验证的消息封装成user_form中进行校验
user_form = UserForm(request.POST)
#判断输入的内容是否正确
if user_form.is_valid():
#user_form.cleaned_data获取表单提交的信息返回为字典的形式.
user_data = user_form.cleaned_data
#注意 :
# 一定要有判断若是没有判断直接写user_form.cleaned_data这条语句则会直接报错
#数据库增加用户名和密码
models.User.objects.create(
username=user_data.get('username'),#get通过字典的键来获取值
pwd=user_data.get('pwd')
)
return HttpResponse('success')#若为正确页面显示success
return render(request,'app01/register_form.html',{'user_form':user_form})
#{'user_form':user_form} 给register_form.html传输数据
自定义效验规则过滤内容
1、导入ValidationError类
2、覆写 clean 方法
# 1、导入ValidationError类
from django.forms import ValidationError
class UserForm(forms.Form):
"""
username、pwd 属性:对应页面中的label标签中显示的内容
label 属性:用来修改label标签中显示的内容
"""
# 生成用户名输入框
username = forms.CharField(
label='用户名',
required=True, # 输入不能为空
min_length=2, # 长度至少2位
error_messages={ #修改错误信息
'required': '不能为空',
'min_length': '至少2位'
}
)
# 生成密码输入框
pwd = forms.CharField(
label='密码',
required=True,
min_length=6,
error_messages={
'required':'不能为空',
'min_length':'至少6位'
}
)
#2、覆写clean方法
def clean(self):
user_data = self.cleaned_data #获取提交的所有数据
username = user_data.get('username') #获取username中的值返回的是字符串
if username:
if username.find('sb') != -1:
#在字符串中查找sb
#若是找不到就返回-1
# != -1 就是找到sb了
error = ValidationError('名称需要有内涵') #创建异常对象
self.add_error('username',error) #在username中添加异常对象
raise error #抛出异常
return self.cleaned_data
自定义规则效验格式
例:手机号码必须为11位
1、导入正则
2、使用关键字validatord
代码:
#导入正则
from django.core.validators import RegexValidator
class UserForm(forms.Form):
#创建手机号输入框
phone = forms.CharField(
label='手机号',
required=True,
#使用关键字validators验证器
validators=[
RegexValidator(r'^[0-9]+$','手机号为数字'),
RegexValidator(r'^1[3-9][0-9]{9}$','手机号格式错误')
],
error_messages={
'required':'必填项',
}
)
设置显示样式
设置密码框和CSS样式
1、导入widgets模块
2、使用关键字widgets
#导入widgets
from django.forms import widgets
class UserForm(forms.Form):
"""
username、pwd 属性:对应页面中的label标签中显示的内容
label 属性:用来修改label标签中显示的内容
"""
# 生成用户名输入框
username = forms.CharField(
label='用户名',
required=True, # 输入不能为空
min_length=2, # 长度至少2位
error_messages={ #修改错误信息
'required': '不能为空',
'min_length': '至少2位'
},
widget=widgets.TextInput(attrs={'class':'name'})
)
# 生成密码输入框
pwd = forms.CharField(
label='密码',
required=True,
min_length=6,
error_messages={
'required':'不能为空',
'min_length':'至少6位'
},
widget=widgets.PasswordInput(render_value=True)
#render_value设置回显
)
#创建手机号输入框
phone = forms.CharField(
label='手机号',
required=True,
#使用关键字validators验证器
validators=[
RegexValidator(r'^[0-9]+$','手机号为数字'),
RegexValidator(r'^1[3-9][0-9]{9}$','手机号格式错误')
],
error_messages={
'required':'必填项',
}
)
#2、覆写clean方法
def clean(self):
user_data = self.cleaned_data #获取提交的所有数据
username = user_data.get('username') #获取username中的值返回的是字符串
if username.find('sb') != -1:
#在字符串中查找sb
#若是找不到就返回-1
# != -1 就是找到sb了
error = ValidationError('名称需要有内涵') #创建异常对象
self.add_error('username',error) #在username中添加异常对象
raise error #抛出异常
return self.cleaned_data
html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form组件</title>
<style type="text/css">
.name{
color: blue;
}
</style>
</head>
<body>
{#novalidate :去掉表单效验,因为自动生成的标签自动添加了 required 属性#}
<form action="" method="post" novalidate>
{% csrf_token %}
{% comment %}
1、user_form 是UserForm类的对象
2、user_form.username :user_form 调用username 属性
3、user_form.username.lable : username 也是一个对象,username.label调用feild对象中的label 属性
{{ user_form.username.label }} :{{ user_form.username }}
4、user_form.username.label_tag :加上_tag就是自动添加:而不用手动来添加:
5、user_form.username.errors.0
注意 : 一定要加.0 因为user_form.username.errors 是一个列表
若是不加的话 就会自动生成无序列表展示在页面上
{% endcomment %}
{{ user_form.username.label_tag }} {{ user_form.username }} <span style="color: red">{{ user_form.username.errors.0 }}</span><br/>
{{ user_form.pwd.label_tag }} {{ user_form.pwd }} <span style="color: red">{{ user_form.pwd.errors.0 }}</span><br/>
{{ user_form.phone.label_tag }} {{ user_form.phone }} <span style="color: red">{{ user_form.phone.errors.0 }}</span><br/>
<input type="submit" value="注册">
</form>