在前面我们实现用户登录的时候,是通过简单的if语句判断,是否正确,错误则会出现提示。假设现在我们呢登录需要用户名、密码、邮箱,那么就需要对每一条信息做判断,验证是否正确,是否符合格式,那么我们需要进行判断,但是这样非常麻烦,让代码看起来非常的臃肿,我们可以使用django为我们提供的方法。
django为我们提供了一个form模板,使用方法非常简单,就是定义一个类,类必须继承:
from django import forms
class FormObj(forms.Form):
#name值必须一样
user=forms.CharField() #用户名为字符串
pwd=forms.CharField() #密码为字符串
email=forms.EmailField() #邮箱格式
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt #当前函数不需要认证
def login(request):
if request.method=='GET':
return render(request,'login.html')
if request.method=='POST':
#获取用户所有数据
#每条数据请求的验证
#成功:获取所有的正确信息
#失败:显示错误信息
obj=FormObj(request.POST)
val=obj.is_valid() #验证是否成功 返回True或者False
print(val)
if val:
print(obj.cleaned_data) #如果为True,所有正确信息都在obj.cleaned_data里面
else:
#print(obj.errors) #False,打印错误信息
print(obj.errors.as_json()) #False,打印错误信息
return redirect('/login/')
以上代码存在于视图views.py中,login.html模板代码就是简单的表单提交:
<form action="/login/" method="post">
{% csrf_token %}
<input type="username" name="user" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="email" name="email" placeholder="邮箱">
<input type="submit" value="登录">
</form>
那么现在运行django程序,直接点击登录,在后台会返回这样的数据:
{"user": [{"message": "This field is required.", "code": "required"}],
"pwd": [{"message": "This field is required.", "code": "required"}],
"email": [{"message": "This field is required.", "code": "required"}]}
控制台输出的就是错误信息,因为我什么也没有填就登录了。现在我们想修改错误信息的提示,只需要添加对应的参数即可:
from django import forms
class FormObj(forms.Form):
#name值必须一样
user=forms.CharField(error_messages={'required':'用户名不能为空'}) #用户名为字符串
pwd=forms.CharField(
max_length=12,
min_length=6,
error_messages={'required':'密码不能为空','min_length':'密码长度不能小于6','max_length':'密码长度不能大于12'}
) #密码为字符串
email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
#邮箱格式错误会出现invalid提示
invalid是邮箱格式错误的时候会显示,为空则显示的是required。如果打印的是obj.errors.as_json(),则会转换为json,想看到中文需要修改为obj.errors。这里的参数跟前面定义数据库表的参数是一样的,可以自行回顾前面的内容。
现在我们已经知道了所有的错误信息都存在obj.errors中,那么我们就可以让用户看到错误提示了:
def login(request):
if request.method=='GET':
return render(request,'login.html')
if request.method=='POST':
#获取用户所有数据
#每条数据请求的验证
#成功:获取所有的正确信息
#失败:显示错误信息
obj=FormObj(request.POST)
val=obj.is_valid() #验证是否成功 返回True或者False
print(val)
if val:
print(obj.cleaned_data) #如果为True,所有正确信息都在obj.cleaned_data里面
else:
print(obj.errors) #False,打印错误信息
print(obj.errors['user'][0]) #用户名的第0个错误信息
return render(request,'login.html',{'obj':obj})
return render(request,'login.html')
#login.html
<form action="/login/" method="post">
{% csrf_token %}
<p><input type="username" name="user" placeholder="用户名">{{ obj.errors.user.0 }}</p>
<p><input type="password" name="pwd" placeholder="密码">{{ obj.errors.pwd.0 }}</p>
<p><input type="email" name="email" placeholder="邮箱">{{ obj.errors.email.0 }}</p>
<input type="submit" value="登录">
</form>
那么这样用户如果信息出现错误就会出现提示,但这里有个问题,只要输入错误,登录就会清空内容,用户名正确会报错,我们先来解决第一个。django在做form验证的时候可以做很多事情,它还可以帮助自动生成input框:
def login(request):
if request.method=='GET':
obj = FormObj()
return render(request,'login.html',{'obj':obj})
if request.method=='POST':
obj=FormObj(request.POST)
val=obj.is_valid() #验证是否成功 返回True或者False
if val:
print(obj.cleaned_data) #如果为True,所有正确信息都在obj.cleaned_data里面
else:
print(obj.errors) #False,打印错误信息
return render(request,'login.html',{'obj':obj})
return render(request,'login.html')
#login.html
<form action="/login/" method="post">
{% csrf_token %}
<p>{{ obj.user }}{{ obj.errors.user.0 }}</p>
<p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
<input type="submit" value="登录">
</form>
需要注意在get请求也要创建一个obj对象,跟post请求的obj相同,两者名字必须一样。这样使用get请求就可以看到django帮我们生成的input输入框,同时解决了信息错误后会清空的问题。这里浏览器会对input输入框检测,你可以把它去掉,不要误认为这是django帮我们生成的错误信息。
用户输入正确的信息,就会出现在obj.cleaned_data里面,那么要实现用户注册非常简单:
def login(request):
if request.method=='GET':
obj = FormObj()
return render(request,'login.html',{'obj':obj})
if request.method=='POST':
obj=FormObj(request.POST)
val=obj.is_valid() #验证是否成功 返回True或者False
if val:
models.UserInfo.objects.create(**obj.cleaned_data) #实现用户注册
else:
print(obj.errors) #False,打印错误信息
return render(request,'login.html',{'obj':obj})
return render(request,'login.html')
在这里django还为我们提供了下面几种快捷的功能,会自动生成对应的html标签:
<form action="/login/" method="post">
{% csrf_token %}
{{ obj.as_p }} {# 对象.as_p 生成p标签#}
<input type="submit" value="登录">
</form>
<form action="/login/" method="post">
{% csrf_token %}
{{ obj.as_ul }} {# 对象.as_ul 生成ul标签#}
<input type="submit" value="登录">
</form>
<form action="/login/" method="post">
{% csrf_token %}
<table>
{{ obj.as_table }} {# 对象.as_table 生成table标签#}
<input type="submit" value="登录">
</table>
</form>
这种更加方便,它会自动显示错误提示,但是在自定制方面就比较麻烦,各自看爱好选择使用吧!form表单的问题还有很多,可参考:Django修改html标签的样式。
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!