Django框架Form表单验证、自动生成html标签

鳄鱼君

发表文章数:643

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Django框架Form表单验证、自动生成html标签

在前面我们实现用户登录的时候,是通过简单的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标签的样式

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架Form表单验证、自动生成html标签》 发布于2020-04-26

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

5 + 3 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册