Django之Form组件
Form组件,用来做一些数据的提前验证,比如登录注册中,我们定义的是邮箱登录,但是用户却手机号登录,那么用Form组件去实现这个验证过程的话,数据的判断逻辑就不会去数据库匹配啦,这样反而会减轻数据库的压力。
所以,Form组件的功能是对用户的请求数据库做验证的。并且对获取的数据也可以做验证功能。
以往的登录注册中的问题:
在以往的登录注册页面中,如果有输入错误,页面是重新刷新的,所以之前输入对的数据也会随之消失。
重复进行用户数据的校验:正则,长度,是否为空等等。
Form组件的解决方法:
先导入模块:
from django.forms import Form from django.forms import fields
后端:
from django.forms import Form from django.forms import fields class LoginForm(Form): username = fields.CharField( max_length=18, min_length=6, required=True, error_messages={ "required":"用户名不能为空", "min_length":"长度不能小于6位", "max_length":"长度不能大于18位", } ) password = fields.CharField( min_length=16, required=True, error_messages={ "required": "密码不能为空", "min_length": "长度不能小于16位", } ) def login(request): if request.method == "GET": return render(request,"login.html") else: obj = LoginForm(request.POST) ret = obj.is_valid() #内部自动校验,ret是False和True的结果 if ret: #用户输入格式正确 print(obj.cleaned_data) #cleaned_data 是一个字典类型,是校验成功后拿到的值。 return redirect('http://www.baidu.com') else: #用户输入格式错误 # print(obj.errors) #所有的错误信息,这个错误信息是一个对象,是 __str__ 方法 # print(obj.errors["username"]) # print(obj.errors["username"][0]) #在LoginForm类中定义了多个条件,那么就可能有多个错误信息,所有可以用索引取第一个 # print(obj.errors["password"]) # print(obj.errors["password"][0]) return render(request,"login.html",{"obj":obj})
前端:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登录</h1> <form method="post" action="login.html"> {% csrf_token %} <p>username:<input type="text" name="username">{{ obj.errors.username.0 }}</p> <p>password:<input type="password" name="password">{{ obj.errors.password.0 }}</p> <input type="submit" value="submit"> </form> </body> </html>
------- END -------