Django组件-forms组件

Posted wxj1129549016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django组件-forms组件相关的知识,希望对你有一定的参考价值。

一、Django组件-forms组件

forms组件

django中的Form组件有以下几个功能:

  1)生成HTML标签

  2)验证用户数据(显示错误信息)

  3)HTML Form提交保留上次提交数据

  4)初始化页面显示内容

校验字段功能

之前写的视图函数,提交的数据,没有做校验,就添加到数据库里面了。这样是不对的!

比如:用户名,必须要符合一定的长度。密码复杂度,等等。

forms组件最大的作用,就是做数据校验

 

普通做法,一个一个写校验规则,没有解耦。校验规则,都在视图函数里面。

新建项目formDemo

修改urls.py,新增路径index

技术分享图片
from app01 import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(index/, views.index),
]
View Code

修改views.py,新增index视图函数

form组件先放到视图函数
单独起一个类,后续会分离出来

技术分享图片
from django.shortcuts import render

# Create your views here.
from django import forms  # 必须导入模块
class DemoForm(forms.Form):  # 必须继承Form
    #限制数据为字符串,最大长度32
    name = forms.CharField(max_length=32)
    age = forms.IntegerField()  # 限制为数字
    email = forms.EmailField()  # 限制为邮箱格式

def index(request):
    return render(request,"index.html")
View Code

templates新增index.html,里面是空的

技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>
View Code

打开Pycharm,点击左下角的Django Console

技术分享图片

输入以下命令,导入视图函数的DemoForm类

from app01.views import DemoForm

效果如下:

技术分享图片

DemoForm类是用来做校验的,它接收一个字典。字典必须包含2个key,分别是name,age,email

测试一个字典数据

执行下面2个命令

form=DemoForm({"name":"xiao","age":"21","email":"[email protected]"})
form.is_valid()

效果如下:输出True

技术分享图片

解释:

is_valid()表示执行校验,如果3个key都符合要求,输出True

 

测试1:age不符合

技术分享图片

 

 3个必须同时成立才行技术分享图片

在DemoForm里面,等式左边对应的是key,等式右边对应校验规则

它有一个默认规则,不能为空

 测试2:少一个字段

技术分享图片

 

测试3:加一个额外的key-value呢?

技术分享图片

 从结果上来看,也是可以通过的。

 它只校验指定的字段,那么额外的键值,会忽略。

 

网页校验

修改urls.py,增加路径addbook

技术分享图片
from app01 import views
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘index/‘, views.index),
    path(‘addbook/‘, views.addbook),
]
View Code

修改views.py,增加addbook视图函数,完整代码如下:

技术分享图片
from django.shortcuts import render,HttpResponse

# Create your views here.
from django import forms  # 必须导入模块
class UserForm(forms.Form):  # 必须继承Form
    #限制数据为字符串,最小长度4,最大长度12
    name = forms.CharField(min_length=4,max_length=12)
    age = forms.IntegerField()  # 限制为数字
    #限制长度为11位
    tel = forms.CharField(min_length=11,max_length=11)

def index(request):
    return render(request,"index.html")

def addbook(request):
    if request.method == "POST":
        # 将post数据传给UserForm
        form = UserForm(request.POST)
        if form.is_valid():  # 验证数据
            print("success")
        else:
            print("fail")
        return HttpResponse("ok")

    return render(request,"addbook.html")
View Code

templates新增addbook.html

做表单校验的时候,一定要注意,表单的name和class的属性必须一一对应

技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>添加用户</h3>
<form action="" method="post">
    {% csrf_token %}
    <lable>姓名</lable><input type="text" name="name"/><br/>
    <lable>年龄</lable><input type="text" name="age"/><br/>
    <lable>邮箱</lable><input type="text" name="email"/><br/>
    <lable>手机号码</lable><input type="text" name="tel"/>
    <br/>
    <input type="submit">
</form>
</body>
</html>
View Code

网页访问添加页面,输出信息

技术分享图片

 提交之后,效果如下:

技术分享图片

Pycharm控制台输出:success

 

空表单直接提交

技术分享图片

Pycharm控制台输出:fail

 

is_valid()

form.is_valid() 它做了2件事情:

1.将数据传给form
2.将验证数据拆分到2个容器中

self.cleaned_data= {} 表示干净的数据
self.error = {} 表示验证不通过的数据

self表示UserForm类的实例对象

 

addbook视图函数

技术分享图片
def addbook(request):
    if request.method == "POST":
        print(request.POST)
        # 将post数据传给UserForm
        form = UserForm(request.POST)
        if form.is_valid():  # 验证数据
            print("###success###")
            print(form.cleaned_data)
            print(form.errors)
        else:
            print("###fail###")
            print(form.cleaned_data)
            print(form.errors)
            print(type(form.errors))

        return HttpResponse("ok")

    return render(request,"addbook.html")
View Code

再次提交数据

技术分享图片

Pycharm控制台输出:

技术分享图片
<QueryDict: {‘tel‘: [‘12345678910‘], ‘email‘: [‘[email protected]‘], ‘name‘: [‘xiao‘], ‘age‘: [‘23‘], ‘csrfmiddlewaretoken‘: [‘wv7VhRwG4YvEO7SqE9qsMnpO4RpH1ys1KdiOrwgnrN3WRgW0IH8prXSUMCgdMz7u‘]}>
###success###
{‘tel‘: ‘12345678910‘, ‘age‘: 23, ‘name‘: ‘xiao‘}

<class ‘django.forms.utils.ErrorDict‘>
View Code

虽然POST发送了5个键值,但是UserForm只校验3个键值。

form.cleaned_data 输出了3个键值

form.errors 输出的内容空,它的类型为ErrorDict

只要有一个错误,就会走else 

错误数据演示

修改views.py,修改UserForm,增加邮箱

 

以上是关于Django组件-forms组件的主要内容,如果未能解决你的问题,请参考以下文章

Django 框架篇: Django中的Form 组件

Django—分页器与form组件

Django框架之Form组件

Django自带序列化组件;分页器;Forms组件

Django Form 组件

Django高级-Form表单组件应用