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), ]
修改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")
templates新增index.html,里面是空的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> </html>
打开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),
]
修改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")
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>
网页访问添加页面,输出信息
提交之后,效果如下:
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")
再次提交数据
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‘>
虽然POST发送了5个键值,但是UserForm只校验3个键值。
form.cleaned_data 输出了3个键值
form.errors 输出的内容空,它的类型为ErrorDict
只要有一个错误,就会走else
错误数据演示
修改views.py,修改UserForm,增加邮箱
以上是关于Django组件-forms组件的主要内容,如果未能解决你的问题,请参考以下文章