编写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