目录
1 校验字段功能2 渲染标签功能渲染方式1渲染方式2渲染方式3
3 渲染错误信息功能视图模板
4 组件的参数配置5 局部钩子6 全局钩子
1 校验字段功能
针对一个实例:注册用户讲解。
模型
models.py
from django
.db
import models
class UserInfo(models
.Model
):
name
=models
.CharField
(max_length
=32)
pwd
=models
.CharField
(max_length
=32)
email
=models
.EmailField
()
模板文件
html.html
<!DOCTYPE html
>
<html lang
="en">
<head
>
<meta charset
="UTF-8">
<title
>Title
</title
>
</head
>
<body
>
<form action
="" method
="post">
{% csrf_token
%}
<div
>
<label
for="user">用户名
</label
>
<p
><input type="text" name
="name" id="name"></p
>
</div
>
<div
>
<label
for="pwd">密码
</label
>
<p
><input type="password" name
="pwd" id="pwd"></p
>
</div
>
<div
>
<label
for="r_pwd">确认密码
</label
>
<p
><input type="password" name
="r_pwd" id="r_pwd"></p
>
</div
>
<div
>
<label
for="email">邮箱
</label
>
<p
><input type="text" name
="email" id="email"></p
>
</div
>
<input type="submit">
</form
>
</body
>
</html
>
视图函数
app01forms.py
from django
import forms
from django
.forms
import widgets
wid_01
= widgets
.TextInput
(attrs
={'class': 'form-control'})
wid_02
= widgets
.PasswordInput
(attrs
={'class': 'form-control'})
class UserForm(forms
.Form
):
name
=forms
.CharField
(max_length
=32,widget
=wid_01
)
pwd
= forms
.CharField
(max_length
=32, widget
=wid_02
)
r_pwd
=forms
.CharField
(max_length
=32,widget
=wid_02
)
email
=forms
.EmailField
(widget
=wid_01
)
views.py
from django
.shortcuts
import render
,HttpResponse
from app01
import appp01forms
def register(request
):
if request
.method
=="POST":
form
=UserForm
(request
.POST
)
if form
.is_valid
():
print(form
.cleaned_data
)
else:
print(form
.cleaned_data
)
print(form
.errors
)
print(form
.errors
.get
("name"))
return HttpResponse
("OK")
form
=UserForm
()
return render
(request
,"register.html",locals())
路由配置
url
(r
'^register/', views
.register
),
2 渲染标签功能
渲染方式1
<!DOCTYPE html
>
<html lang
="en">
<head
>
<meta charset
="UTF-8">
<title
>Title
</title
>
<!
-- 最新版本的 Bootstrap 核心 CSS 文件
-->
<link rel
="stylesheet" href
="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity
="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin
="anonymous">
</head
>
<body
>
<h3
>注册页面
</h3
>
<div
class="container">
<div
class="row">
<div
class="col-md-6 col-lg-offset-3">
<form action
="" method
="post">
<div
>
<label
for="">用户名
</label
>
{{ form
.name
}}
</div
>
<div
>
<label
for="">密码
</label
>
{{ form
.pwd
}}
</div
>
<div
>
<label
for="">确认密码
</label
>
{{ form
.r_pwd
}}
</div
>
<div
>
<label
for=""> 邮箱
</label
>
{{ form
.email
}}
</div
>
<input type="submit" class="btn btn-default pull-right">
</form
>
</div
>
</div
>
</div
>
</body
>
</html
>
渲染方式2
<!doctype html
>
<html lang
="en">
<head
>
<meta charset
="UTF-8">
<meta name
="viewport"
content
="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http
-equiv
="X-UA-Compatible" content
="ie=edge">
<link rel
="stylesheet" href
="/static/bootstrap/css/bootstrap.min.css">
<title
>Document
</title
>
</head
>
<body
>
<div
class="col-md-6 col-md-offset-3">
<form action
="" method
="post">
{% for file in form
%}
<div
>
<label
for="">{{ file.label
}}</label
>
{{ file }}
</div
>
{% endfor
%}
<input type="submit" class="btn btn-info pull-right">
</form
>
</div
>
</body
>
</html
>
渲染方式3
<form action
="" method
="post">
{% csrf_token
%}
{{ form
.as_p
}}
<input type="submit" class="btn btn-default pull-right">
</form
>
3 渲染错误信息功能
视图
from django
.shortcuts
import render
,HttpResponse
from app01
import appp01forms
def register(request
):
if request
.method
=="POST":
form
=UserForm
(request
.POST
)
if form
.is_valid
():
print(form
.cleaned_data
)
else:
print(form
.cleaned_data
)
print(form
.errors
)
print(form
.errors
.get
("name"))
return HttpResponse
("OK")
form
=UserForm
()
return render
(request
,"register.html",locals())
模板
<form action
="" method
="post" novalidate
>
{% csrf_token
%}
{% for field
in form
%}
<div
>
<label
for="">{{ field
.label
}}</label
>
{{ field
}} <span
class="pull-right" style
="color: red">{{ field
.errors
.0 }}</span
>
</div
>
{% endfor
%}
<input type="submit" class="btn btn-default">
</form
>
4 组件的参数配置
from django
.forms
import widgets
wid_01
= widgets
.TextInput
(attrs
={'class': 'form-control'})
wid_02
= widgets
.PasswordInput
(attrs
={'class': 'form-control'})
class UserForm(forms
.Form
):
name
=forms
.CharField
(max_length
=10,min_length
=2,label
='用户名',
error_messages
={'required':'该字段不能为空','invaild':'格式错误',
'max_length':'太长','mim_length':'太短'}
,widget
=wid_01
)
pwd
= forms
.CharField
(max_length
=10,min_length
=2, widget
=wid_02
)
r_pwd
=forms
.CharField
(max_length
=10,min_length
=2,widget
=wid_02
)
email
=forms
.EmailField
(widget
=wid_01
,label
='邮箱',error_messages
={'required':'该字段不能为空',
'invaild':'格式错误'})
5 局部钩子
from django
.forms
import ValidationError
def clean_name(self
):
name
= self
.cleaned_data
.get
('name')
if name
.startswith
('sb'):
raise ValidationError
('不能以sb开头')
else:
return name
6 全局钩子
def clean(self
):
password
= self
.cleaned_data
.get
('password')
re_password
= self
.cleaned_data
.get
('re_password')
if password
== re_password
:
return self
.cleaned_data
else:
raise ValidationError
('两次密码不一致')