WEB框架Django进阶----form验证

form验证

以前我们写form表单验证是这样的:

views.py

 1 def login(request):
 2     # f = open("templates/login.html","r",encoding="utf-8")
 3     # date = f.read()
 4     # f.close()
 5 
 6     error_msg = " "
 7     if request.method == "POST":
 8         user = request.POST.get("user",None)
 9         pwd = request.POST.get("pwd",None)
10 
11         if user=="root" and pwd=="123":
12             return redirect("http://www.baidu.com")
13         else:
14             error_msg = "用户名密码错误"
15 
16     return render(request,"login.html",{"error_msg":error_msg})
View Code

login.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <link rel="stylesheet" href="/static/commons.css" />
 7     <style>
 8         label{
 9             width: 80px;
10             text-align: right;
11             display: inline-block;
12         }
13     </style>
14 </head>
15 <body>
16         <form action="/login/" method="post">
17         <p>
18             <label for="username">用户名:</label>
19             <input id="username" name="user" type="text" />
20         </p>
21         <p>
22             <label for="password">密码:</label>
23             <input id="password" name="pwd" type="text" />
24             <input type="submit" value="提交" />
25             <span style="color: red">{{ error_msg }}</span>
26         </p>
27     </form>
28     <script src="/static/jquery-1.12.4.js"></script>
29 </body>
30 </html>
View Code

这样是可以的,但是不能细化每行的错误提示,其实在django中django自带了form的验证

是这样的

views.py

 1 from django import forms
 2 class FM(forms.Form):
 3     user = forms.CharField(error_messages={"required":"用户名不能为空"})
 4     pwd = forms.CharField(
 5         max_length=12,
 6         min_length=6,
 7         error_messages={"required":"密码不能为空","max_length":"密码长度不能超过12","min_length":"密码长度不能小于6"}
 8     )
 9     email = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式不正确"})
10 
11 def fm(request):
12     if request.method == "GET":
13         return render(request,"fm.html")
14     elif request.method == "POST":
15         obj = FM(request.POST)
16         r1 = obj.is_valid()
17         # print(r1)
18         if r1:
19             print(obj.cleaned_data)
20         else:
21             print(obj.errors)
22             return render(request, "fm.html",{"obj":obj})

fm.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/fm/" method="post">
 9         {% csrf_token %}
10         <p><input type="text" name="user" />{{ obj.errors.user.0 }}</p>
11         <p><input type="text" name="pwd" />{{ obj.errors.pwd.0 }}</p>
12         <p><input type="text" name="email" />{{ obj.errors.email.0 }}</p>
13         <p><input type="submit" value="提交" /></p>
14 
15     </form>
16 </body>
17 </html>

显示效果:

但是还存在一个问题,你看,一点提交,数据都跑哪里了, 填写的数据不见了,怎么办呢?那要是我们想保留上一次操作的数据?

可以这样搞一下,

django中的form还可以生成<input>标签的

views.py

1 def fm(request):
2     if request.method == "GET":
3         obj = FM()
4         return render(request,"fm.html",{"obj":obj})

fm.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/fm/" method="post">
 9         {% csrf_token %}
10         <p>{{ obj.user }}{{ obj.errors.user.0 }}</p>
11         <p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>
12         <p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
13         <p><input type="submit" value="提交" /></p>
14 
15     </form>
16 </body>
17 </html>

显示效果:

 那如果提交是正确的数据呢?返回到后端显示的是一个字典格式的

那么这样写就可以在数据库中添加一个用户,完成注册了

 1 from app01 import models
 2 def fm(request):
 3     if request.method == "GET":
 4         obj = FM()
 5         return render(request,"fm.html",{"obj":obj})
 6     elif request.method == "POST":
 7         obj = FM(request.POST)
 8         r1 = obj.is_valid()
 9         # print(r1)
10         if r1:
11             #print(obj.cleaned_data)
12             models.UserInfo.objects.create(**obj.cleaned_data)   #完成注册添加进数据库

在html中还 可以在简化,看下面

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/fm/" method="post">
 9         {% csrf_token %}
10 {#        <p>{{ obj.user }}{{ obj.errors.user.0 }}</p>#}
11 {#        <p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>#}
12 {#        <p>{{ obj.email }}{{ obj.errors.email.0 }}</p>#}
13         {{ obj.as_p }}
14 
15         {{ obj.as_ul }}
16 
17         <table>{{ obj.as_table }}</table>
18         
19         <p><input type="submit" value="提交" /></p>
20 
21     </form>
22 </body>
23 </html>

显示效果:

但是不建议这样做,这样做不能针对每一个自定制的标签做处理。

猜你喜欢

转载自www.cnblogs.com/garrett0220/p/9081764.html