心得:坚持住,因为你正在走上坡路,走过去你就一定会有进步
一、Form介绍
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。
Django form组件就实现了上面所述的功能,其实form组件的主要功能如下:
- 生成页面可用的HTML标签
- 对用户提交的数据进行校验
- 保留上次输入内容
二、django的form的用法
1. 定义
from django import forms
from django.forms import widgets
class User(forms.Form):
user = forms.CharField(label="用户名",min_length=6)
pwd = forms.CharField(label="密码")
2.视图中使用
def register2(request):
form = User()
if request.method == "POST":
form = User(request.POST)
if form.is_valid(): #去校验数据是否合格
print(form.cleaned_data['user']) ## cleaned_data 是经过校验的数据
return HttpResponse("注册成功")
return render(request,'register2.html',context={"form":form})
3.模板中使用
{{ form_obj.as_p }} ——》自动生成多个p标签 包含label input框
{{ form_obj.user }} ——》 生成某个字段的input框
{{ form_obj.username.id_for_label }} ——》 生成某个字段id
{{ form_obj.user.errors }} ——》 某个字段的所有错误信息
{{ form_obj.user.errors.0 }} ——》 某个字段的错误信息的第一个
{{ form_obj.errors }} ——》 所有字段的错误信息
三、普通方式form注册并校实现字符验功能
views.py
from django.shortcuts import render,HttpResponse
def register(request):
error = ''
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if len(user)<6:
error = "你的用户名字符少于六位"
else:
return HttpResponse("注册成功")
return render(request,'reg.html',context={"error":error})
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>用户名
<input type="text" name="user">
</p>
<p>密码
<input type="password" name="pwd">
</p>
<p>{{ error }}</p>
<button>注册</button>
</form>
</body>
</html>
四、使用django的form校验工具来实现注册功能
forms.py
在注册的app下新建文件forms.py来建form表单,可对字符内容进行限制
from django import forms
class User(forms.Form):
user = forms.CharField(label="用户名",min_length=6)
pwd = forms.CharField(label="密码")
views.py
导入表单后实例化使用
from django.shortcuts import render,HttpResponse
from app01.forms import User
def register2(request):
form = User() #实例化后使用
if request.method == "POST":
form = User(request.POST)
if form.is_valid(): #去校验数据是否合格
print(form.cleaned_data['user']) ## cleaned_data 是经过校验的数据
return HttpResponse("注册成功")
return render(request,'register2.html',context={"form":form}) #传递参数
reg.html
只需要将实例化的表单{{ form.as_p }}方法就会生成相应的表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button>注册</button>
</form>
</body>
</html>
• 前端页面是form类的对象生成的 -->生成HTML标签功能
• 当用户名和密码输入为空或输错之后 页面都会提示 -->用户提交校验功能
• 当用户输错之后 再次输入 上次的内容还保留在input框 -->保留上次输入内容
五、From中常用字段和插件
1. 初始值,input框里面的初始值。initial
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值
)
pwd = forms.CharField(min_length=6, label="密码")
2. 重写错误信息。error_messages
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="密码")
3. 密码格式。password
使用widget插件可以转换字段类型,需要导入插件
from django.forms import widgets
class RegForm(forms.Form):
pwd = forms.CharField(
label='密码',
min_length=6,
widget=widgets.PasswordInput()
)
4. 单radio值为字符串
from django import forms
from django.forms import widgets
class User(forms.Form):
user = forms.CharField(label="用户名",min_length=6)
pwd = forms.CharField(label="密码")
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.RadioSelect()
)
5. 单选Select
from django import forms
from django.forms import widgets
class User(forms.Form):
hobby = forms.fields.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=3,
widget=forms.widgets.Select()
)
6.多选Select
from django.forms import widgets
class LoginForm(forms.Form):
...
hobby = forms.fields.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
7. 单选checkbox
class LoginForm(forms.Form):
...
keep = forms.fields.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)
9. 多选checkbox
class LoginForm(forms.Form):
...
hobby = forms.fields.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)
六、校验
1. 内置校验
min_length 最小长度
max_length 最大长度
required 是否是必填的
2. 自定义校验器
正则校验
RegexValidator(正则,错误提示)
from django.core.validators import RegexValidator
class User(forms.Form):
phone = forms.CharField(
validators=[RegexValidator(r'1[3-9]\d{9}',"手机号不对")]
)
函数校验
from django.core.exceptions import ValidationError
def check(val):
if "tian" == val:
raise ValidationError("你输入的用户是错误的")
class User(forms.Form):
user = forms.CharField(label="用户名",validators=[check])
7、form表单注册功能实现
views.py
from django.shortcuts import render,HttpResponse,redirect
from app01.forms import User,Login
def reg_last(request):
form_obj = Login()
if request.method == 'POST':
form_obj = Login(request.POST)
if form_obj.is_valid():
# 数据库操作
return redirect('https://www.baidu.com')
return render(request,'reg_last_self.html',context={"form_obj":form_obj})
forms.py
from django import forms
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
class Login(forms.Form):
username = forms.CharField(
label="用户名"
)
password = forms.CharField(
label='密码',
min_length=6,
widget=widgets.PasswordInput()
)
re_password = forms.CharField(
label='确认密码',
min_length=6,
widget=widgets.PasswordInput()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({'class': 'form-control'})
def clean(self):
pwd = self.cleaned_data.get('password')
re_pwd = self.cleaned_data.get('re_password')
if pwd == re_pwd:
return self.cleaned_data
self.add_error('re_password', '两次密码不一致')
raise ValidationError('两次密码不一致')
reg.html
form表单中novalidate当提交表单时不对表单数据(输入)进行验证:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="{% static 'reg.css' %}">
</head>
<body>
<div class="di"></div>
<div class="container">
<div class="form">
<form action="" method="post" novalidate>
{% csrf_token %}
<div class="user">
<label for="{{ form_obj.username.id_for_label }}">用户名</label>
{{ form_obj.username }}
</div>
<div class="pwd">
<label for="{{ form_obj.password.id_for_label }}">密码</label>
{{ form_obj.password }}
</div>
<span id="helpBlock2" class="help-block">{{ form_obj.password.errors.0 }}</span>
<div class="re_pwd">
<label for="{{ form_obj.re_password.id_for_label }}">确认密码</label>
{{ form_obj.re_password }}
</div>
<span id="helpBlock2" class="help-block">{{ form_obj.re_password.errors.0 }}</span>
<div class="button">
<button>注册</button>
</div>
</form>
</div>
</div>
</body>
</html>
reg.css
*{
margin:0;
padding:0;
}
.container{
width:1226px;
margin:75px auto;
}
.form{
width:500px;
margin:0 auto;
}
input{
width:210px;
height:20px;
padding:10px;
margin-top:20px;
font-size:40px;
}
label{
margin-right:30px;
font-size:25px;
}
button{
padding:15px;
}
.help-block{
margin-left:100px;
color:red;
font-size:15px;
}