2.8.5Django --11 Django的forms组件

Django目录:https://blog.csdn.net/qq_41106844/article/details/105554082

什么是forms组件

forms组件就是django内置的一个类,来弥补form表单的功能,例如提供校验数据,渲染表单,页面显示错误等功能。

接着我们就通过一个简单的登录注册例子来讲解forms组件。

简单例子

他需要完成四个功能:
1.校验数据
2.页面显示错误信息
3.渲染页面
4.重置输入

校验规则如下:
用户名不能低于五个字。
密码必须是纯数字。
邮箱必须符合邮箱格式。
错误返回给用户。

formsDemo.formsDemo.urls.py
---------------------------
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/',views.register)
]

formsDemo.app01.models.py
-------------------------
from django.db import models

# Create your models here.
class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.IntegerField()
    email=models.EmailField()

formsDemo.app01.views.py
------------------------
from django.shortcuts import render,HttpResponse
from app01.models import UserInfo

#使用forms进行校验的话,必须设置一个forms的类用来定义规则。
from django import forms
class UserForm(forms.Form):
    #自定义报错信息
    msg={'required':'该字段不能为空'}
    #设置name长度不能超过5.
    name=forms.CharField(max_length=5,error_messages=msg)
    #设置密码只能是纯数字.
    pwd=forms.IntegerField()
    email=forms.EmailField(error_messages={"invalid":"邮箱格式不正确"})

def register(request):

    if request.method=="POST":
        form=UserForm(request.POST)
        # is_valid  用来校验数据是否合法
        if form.is_valid():
            print(form.cleaned_data)       # 所有干净的字段以及对应的值
            #将合法数据写入数据库
            UserInfo.objects.create(**form.cleaned_data)
            #返回ok
            return HttpResponse("OK")
        else:
            # cleaned_data输出不合法数据  errors输出字段错误信息
            print(form.cleaned_data)       #
            print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}
            print(form.errors.get("name")) # ErrorList ["错误信息",]
            # 获取错误
            error = form.errors
            #将错误返回给模板
            return render(request, "register.html", locals())
    else:
        return render(request,'register.html')
formsDemo.templates.register.html
---------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .error{
            color:red;
        }
    </style>
</head>
<body>

<form action="" method="post">
    {% csrf_token %}
    <div>
        <label for="user">用户名</label>
        <p><input type="text" name="name" id="name"></p><span class="error">{{ error.name.0 }}</span>
    </div>
    <div>
        <label for="pwd">密码</label>
        <p><input type="password" name="pwd" id="pwd"></p><span>{{ error.pwd.0 }}</span>
    </div>
     <div>
        <label for="email">邮箱</label>
        <p><input type="text" name="email" id="email"></p><span>{{ error.email.0 }}</span>
    </div>
    <input type="submit">
</form>

</body>
</html>
 
20155953-88ea80be722db3c3.png
页面截图
 
20155953-f76e9b7e624e8cef.png
校验规则1-1
 
20155953-5cc78bf2d512331e.png
校验规则1-2
 
20155953-283f973663172fd9.png
校验规则2-1
 
20155953-5416c474056d4a9a.png
校验规则2-2
 
20155953-8af6ef182853bef5.png
校验规则3-1
 
20155953-acff07e54cbb2880.png
校验规则3-2
 
20155953-7ae39ce2bde32e2d.png
一条正确的数据
 
20155953-308961b099716c61.png
提交成功的页面

现在我们的例子完成了 1 和 2 两个功能,还有渲染页面和重置数据没有完成。我么现在的页面有四个input标签,可以一个一个手打,但是如果有十个,二十个呢,我们怎么自己生产form表单,这就是渲染页面的功能。 同时如果我们表单有一项填错了,后台会自动返回新的页面,我们刚才填的数据就没了,这就是很没有用户体验的事情。

渲染页面方式1

formsDemo.app01.views.py
------------------------
def register(request):  
    if request.method=="POST":
        form = UserForm(request.POST)
        # is_valid  用来校验数据是否合法
        if form.is_valid():
            print(form.cleaned_data)       # 所有干净的字段以及对应的值
            #将合法数据写入数据库
            UserInfo.objects.create(**form.cleaned_data)
            #返回ok
            return HttpResponse("OK")
        else:
            # cleaned_data输出不合法数据  errors输出字段错误信息
            print(form.cleaned_data)       #
            print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}
            print(form.errors.get("name")) # ErrorList ["错误信息",]
            # 获取错误
            error = form.errors
            #将错误返回给模板
            return render(request, "register.html", locals())

    else:
        form = UserForm()
        return render(request,'register.html',locals())
formsDemo.templates.register.html
---------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="" method="post">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit">
</form>

</body>
</html>
 
20155953-1c7edf9b6cc4629b.png
渲染页面1

 

 
20155953-0be6c1f4689a5618.png
渲染代码

 

渲染页面方式2:

formsDemo.templates.register.html
---------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="" method="post">
    {% csrf_token %}
    <p>用户名 {{ form.name }}<span class="error">{{ error.name.0 }}</span></p>
    <p>密码 {{ form.pwd }}<span class="error">{{ error.pwd.0 }}</span></p>
    <p>邮箱 {{ form.email }}<span class="error">{{ error.email.0 }}</span></p>
    <input type="submit">
</form>

</body>
</html>
 
20155953-39dd3ef23d6658ac.png
渲染页面
 
20155953-2dbc5eebc08bfe88.png
渲染代码

Django渲染标签报错,浏览器就会拦截。
不过后台该校验就校验。

 

 
20155953-9fba065ca3624651.png
小惊喜

 

 

取消前端校验

 

{#novalidate#}
<form action="" method="post" novalidate>
    {% csrf_token %}
    <p>用户名 {{ form.name }}<span class="error">{{ error.name.0 }}</span></p>
    <p>密码 {{ form.pwd }}<span class="error">{{ error.pwd.0 }}</span></p>
    <p>邮箱 {{ form.email }}<span class="error">{{ error.email.0 }}</span></p>
    <input type="submit">
</form>
 
20155953-bba5bd73578bf954.png
取消校验

 

我们刚才输错信息会重置输入信息功能的功能也解决了。

 

 

 
20155953-d2adc345b005d5c2.png
真正的惊喜

 

 

这是因为,咱们的错误信息是使用form表单渲染的,而数据也是用form表单来渲染的。

 

渲染页面方式3:

formsDemo.app01.views.py
-----------------------
class UserForm(forms.Form):
    #自定义报错信息
    msg={'required':'该字段不能为空'}
    #设置name长度不能超过5.
    #label设置别名。
    name=forms.CharField(max_length=5,error_messages=msg,label='用户名')
    #设置密码只能是纯数字.
    pwd=forms.IntegerField(label='密码')
    email=forms.EmailField(error_messages={"invalid":"邮箱格式不正确"},label='邮箱')
formsDemo.templates.register.html
---------------------------------
<form action="" method="post" novalidate>
    {% csrf_token %}
    {% for field in form %}
        <div>
            <label for="">{{ field.label }}</label>
            {{ field }}<span class="error">{{ field.errors.0 }}</span>
        </div>
    {% endfor %}
    <input type="submit">
</form>
 
20155953-60661a22668dc7de.png
渲染页面

 

 
20155953-f1b0ad733d147048.png
渲染代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值