今天来谈谈Django的Form组件操作

Django中的Form一般有两种功能:


  ·输入html
  ·验证用户输入

Form验证流程


  ·定义规则(是一个类)
     ·前端把数据提交过来
  ·匹配规则
  ·判断提交过来的数据是否符合定义的规则
  ·如果匹配返回True,否则返回errors,可以把这个errors返回给前端,让前端显示到指定位置(比如用户名没填写,验证码没填写)

匹配规则


views.py

from django import forms
from django.forms import widgets #Forms里的插件 里面有css插件和其他的插件
from django.forms import fields #CharField、EmailField等都在field里,而field在fdjango.forms里,所以以后使用fields.CharField()替代forms.CharField
class FM(forms.Form):
user=fields.CharField(error_messages={'required':"用户名不能为空"},
widget=widgets.Textarea(attrs={"class":"c1"})) #为User添加个“class='c1'”样式
pwd=fields.CharField(
max_length=12,
min_length=6,
error_messages={'required':"密码不能为空",
'min_length':'密码长度不能小于6位',
'max_length':'密码长度不能大于12位'},
widget=widgets.PasswordInput(attrs={'class':'c2'}))
email=fields.EmailField(error_messages={'required':"邮箱不能为空",'invalid':'邮箱格式错误'})

注意:规则中的字段名必须得等于html中name的值

Form表单方法


views.py

from app_01 import models
def fm(request):
if request.method=="GET":
obj=FM()
return render(request,'fm.html',{'obj':obj})
elif request.method=="POST":
#获取用户所有数据
#每条数据请求的验证
#成功:获取所有的正确信息
#失败:显示错误信息
obj=FM(request.POST)
r1=obj.is_valid()
if r1:
# models.UserInfo.object.create(obj.cleaned_data) 对其进行注册
print(obj.cleaned_data)
else:
return render(request,'fm.html',{'obj':obj})
return render(request,'fm.html')

方法:

obj.is_valid():验证表单数据是否合法

obj.errors:表单的错误以字典形式返回(如果有多个错误,可以循环这个字典,然后传给前端)

obj.cleaned_data:获取表单数据

obj.as_p:将表单渲染成P标签

示例:实现Form组件验证


前端html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/fm/" method="post">
<p><input type="text" name="user" />{{ obj.errors.user.0 }}</p>
<p><input type="text" name="pwd" />{{ obj.errors.pwd.0 }}</p>
<p><input type="email" name="email" />{{ obj.errors.email.0 }}</p>
<input type="submit" value="提交" />
</form>
</body>
</html>

views.py

from django import forms
class FM(forms.Form):
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':'邮箱格式错误'}) from app_01 import models
def fm(request):
if request.method=="GET":
obj=FM()
return render(request,'fm.html',{'obj':obj})
elif request.method=="POST":
#获取用户所有数据
#每条数据请求的验证
#成功:获取所有的正确信息
#失败:显示错误信息
obj=FM(request.POST) #request.POST是获取用户前端输入内容,例如:<QueryDict: {'pwd': ['1111'], 'user': ['11111'], 'undefined': ['提交']}>
r1=obj.is_valid() #判断用户输入是否符合上面LoginForm定义的规则,如果符合返回True,否则范围False(符合规则就是 比如:不能为空,最大输入字符为10个等等)
if r1:
# models.UserInfo.object.create(obj.cleaned_data) 对其进行注册
print(obj.cleaned_data) #obj.clean()方法是获取用户输入内容(例如:{'pwd': '1111', 'user': '11111'})
else:
print(obj.errors) #obj.errors是获取用户输入的错误信息,比如说规则里定义了不能为空,但是用户输入为空了,就会报错(例如:<li>pwd<ul class="errorlist"><li>This field is required.</li></ul>)
return render(request,'fm.html',{'obj':obj})
return render(request,'fm.html')

在高级点,修改下前端的html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/fm/" method="post">
<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>
</body>
</html>

因为Django里没有手机验证,所以基于正则表达式的手机验证如下

import re
from django import forms
from django.core.exceptions import ValidationError def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误') class PublishForm(forms.Form): user_type_choice = (
(0, u'普通用户'),
(1, u'高级用户'),
) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
attrs={'class': "form-control"})) title = forms.CharField(max_length=20,
min_length=5,
error_messages={'required': u'标题不能为空',
'min_length': u'标题最少为5个字符',
'max_length': u'标题最多为20个字符'},
widget=forms.TextInput(attrs={'class': "form-control",
'placeholder': u'标题5-20个字符'})) memo = forms.CharField(required=False,
max_length=256,
widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3})) phone = forms.CharField(validators=[mobile_validate, ],
error_messages={'required': u'手机不能为空'},
widget=forms.TextInput(attrs={'class': "form-control",
'placeholder': u'手机号码'})) email = forms.EmailField(required=False,
error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

Django之Form组件验证的更多相关文章

  1. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  2. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  3. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  4. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

  5. Django之Form组件(一)

    Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...

  6. python框架之Django(10)-Form组件

    介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  7. 〖Python〗-- Django的Form组件

    [Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...

  8. django 使用form组件提交数据之form表单提交

    django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...

  9. web之Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

随机推荐

  1. Java实现的词频统计

    要求: 1.读取文件: 2.记录出现的词汇及出现频率: 3.按照频率降序排列: 4.输出结果. 概要: 1.读取的文件路径是默认的,为了方便调试,将要统计的文章.段落复制到文本中即可:2.只支持英文: ...

  2. PAT 甲级 1050 String Subtraction

    https://pintia.cn/problem-sets/994805342720868352/problems/994805429018673152 Given two strings S~1~ ...

  3. nginx & restart

    nginx & restart https://www.cyberciti.biz/faq/nginx-linux-restart/

  4. js控制iframe高度自动撑开

    <iframe src="index.html" width="100%" name="" id="myiframe&quo ...

  5. Angel Beats,AFOer Beats?

    意识模糊的时候适合写一些奇怪的东西? NOI退役之后我尝试了很多方法调节心态.(比如做OI题,出OI题,学文化课,读书,吃饭,睡觉,水群,看番,推galgame). 然而看啥都是退役的画风.比如说推W ...

  6. C++解析(30):关于指针判别、构造异常和模板二义性的疑问

    0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...

  7. 「美团 CodeM 资格赛」跳格子

    题目描述 nnn 个格子排成一列,一开始,你在第一个格子,目标为跳到第 n 个格子.在每个格子 i 里面你可以做出两个选择: 选择「a」:向前跳 ai​​ 步. 选择「b」:向前跳 bi 步. 把每步 ...

  8. DjangoORM外键操作

    Django ORM 外键操作 经常修改的东西一般不放到内存里面,而是放到一张表里.表跟表之间是可以存在关系的,最基本的就是一对多的关系. models.ForeignKey(ColorDic) 1. ...

  9. 转:评估指标MAP

    转:http://www.zhenv5.com/?p=1079 MAP可以由它的三个部分来理解:P,AP,MAP 先说P(Precision)精度,正确率.在信息检索领域用的比较多,和正确率一块出现的 ...

  10. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...