编写Django的form表单,非常类似我们在模型系统里编写一个模型。在模型中,一个字段代表数据表的一列,而form表单中的一个字段代表<form>中的一个<input>元素。
校验字段功能
针对一个实例:注册用户讲解。
模型:models.py
1
2
3
4
5
|
class UserInfo(models.Model):
name = models.CharField(max_length = 32 )
pwd = models.CharField(max_length = 32 )
email = models.EmailField()
tel = models.CharField(max_length = 32 )
|
模板: register.html:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<!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 >
|
视图函数:register
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# 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)
tel = forms.CharField(max_length = 32 ,widget = wid_01)
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) # ErrorDict : {"校验错误的字段":["错误信息",]}
print (form.errors.get( "name" )) # ErrorList ["错误信息",]
return HttpResponse( "OK" )
form = UserForm()
return render(request, "register.html" , locals ())
|
1,渲染标签功能
渲染方式1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<!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" rel = "external nofollow" 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" >
{% csrf_token %}
< 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
1
2
3
4
5
6
7
8
9
10
11
12
|
< form action = "" method = "post" >
{% csrf_token %}
{% for field in form %}
< div >
< label for = "" >{{ field.label }}</ label >
{{ field }}
</ div >
{% endfor %}
< input type = "submit" class = "btn btn-default pull-right" >
</ form >
|
渲染方式3
1
2
3
4
5
6
7
|
< form action = "" method = "post" >
{% csrf_token %}
{{ form.as_p }}
< input type = "submit" class = "btn btn-default pull-right" >
</ form >
|
2,显示错误与重置输入信息功能
视图
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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) # ErrorDict : {"校验错误的字段":["错误信息",]}
print (form.errors.get( "name" )) # ErrorList ["错误信息",]
return render(request, "register.html" , locals ())
form = UserForm()
return render(request, "register.html" , locals ())
|
模板
1
2
3
4
5
6
7
8
9
10
11
12
|
< 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 >
|
3,局部钩子与全局钩子
模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# forms组件
from django.forms import widgets
wid_01 = widgets.TextInput(attrs = { "class" : "form-control" })
wid_02 = widgets.PasswordInput(attrs = { "class" : "form-control" })
from django.core.exceptions import ValidationError
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)
tel = forms.CharField(max_length = 32 ,widget = wid_01)
# 局部钩子
def clean_name( self ):
val = self .cleaned_data.get( "name" )
if not val.isdigit():
return val
else :
raise ValidationError( "用户名不能是纯数字!" )
# 全局钩子
def clean( self ):
pwd = self .cleaned_data.get( "pwd" )
r_pwd = self .cleaned_data.get( "r_pwd" )
if pwd = = r_pwd:
return self .cleaned_data
else :
raise ValidationError( '两次密码不一致!' )
def register(request):
if request.method = = "POST" :
form = UserForm(request.POST)
if form.is_valid():
print (form.cleaned_data) # 所有干净的字段以及对应的值
else :
clean_error = form.errors.get( "__all__" )
return render(request, "register.html" , locals ())
form = UserForm()
return render(request, "register.html" , locals ())
|
视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< 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" >
{% if field.label == 'R pwd' %}
< span >{{ clean_error.0 }}</ span >
{% endif %}
{{ field.errors.0 }}
</ span >
</ div >
{% endfor %}
< input type = "submit" class = "btn btn-default" >
</ form >
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/xh-0205/p/9742146.html