forms组件

news/发布时间2024/8/25 7:14:48

forms组件

基本使用

from django import formsclass MyForm(forms.Form):# username字符串类型最小3位最大8位username = forms.CharField(min_length=3,max_length=8)# password字符串类型最小3位最大8位password = forms.CharField(min_length=3,max_length=8)# email字段必须符合邮箱格式  xxx@xx.comemail = forms.EmailField()

校验数据(可以少传但是不能多传)

"""
1.测试环境的准备 可以自己拷贝代码准备 就是用test.py
2.其实在pycharm里面已经帮你准备一个测试环境python console
"""
# 这是在 python console 里面运行的
from app01 import views
# 1 将待校验的数据组织成字典的形式传入即可
form_obj = views.MyForm({'username':'tiger', 'password':'123', 'email':'123'})
# 2 判断是否合法 只有在所有的数据都合法的情况下才返回True
form_obj.is_valid()	 	
False
# 3 查看所有校验通过的数据 (清洗过后的数据 也就是合法的数据)
form_obj.cleaned_data	
{'username': 'tiger', 'password': '123'}
# 4 查看所有不符合校验规则以及不符合的原因 (不合法的数据 错误的数据)
form_obj.errors			
{'email': ['Enter a valid email address.']}
# 5 校验数据直校验类中出现的字段 多传不影响 多传的字段直接忽略
form_obj = views.MyForm({'username':'tiger', 'password':'123', 'email':'123@qq.com', 'hobby': 'study'})
form_obj.is_valid()
True
# 6 校验数据 默认情况下 类里面所有的字段都必须传值
form_obj = views.MyForm({'username':'tiger', 'password':'123'})
form_obj.is_valid()
False
form_obj.errors
{'email': ['This field is required.']}"""
也就意味着校验数据的时候 默认情况下数据可以多传但是绝不能少传
"""

渲染标签

"""
forms组件只会自动帮你渲染获取用户输入的标签(input select radio checkbox)不能帮你渲染提交按钮,自己渲染!!!
"""
# 后端
class MyForm(forms.Form):# username字符串类型最小3位最大8位username = forms.CharField(min_length=3, max_length=8, label='用户名')# password字符串类型最小3位最大8位password = forms.CharField(min_length=3, max_length=8)# email字段必须符合邮箱格式 xxx@xx.comemail = forms.EmailField()def index(request):form_obj = MyForm()return render(request, 'index.html', locals())# 前端利用后端生成的空对象做操作
<form action="" method="post"><p>第一种渲染方式:代码书写极少 封装程度太高 不便于后续的扩展 一般情况下只在本地测试使用</p>{{ form_obj.as_p }}{{ form_obj.as_table }}{{ form_obj.as_ul }}<p>第二种渲染方式:可扩展性强 但是需要书写的代码太多 一般情况下不用</p><p>{{ form_obj.username.label }}:{{ form_obj.username }}</p><p>{{ form_obj.password.label }}:{{ form_obj.password }}</p><p>{{ form_obj.email.label }}:{{ form_obj.email }}</p><p>第三种渲染方式(推荐使用):代码书写简单 并且扩展性也高</p>{% for form in form_obj %}<p>{{ form.label }}:{{ form }}</p>   # {{ form }}就相当于是第二种渲染方式里面的{{ form_obj.xxx }}{% endfor %}
</form>"""
label属性默认展示的是类中定义的字段首字母大写的形式
也可以自己修改 直接给字段对象加label属性即可username = forms.CharField(min_length=3,max_length=8,label='用户名')
"""

展示提示信息

"""
浏览器会自动帮你校验数据 但是前端的校验弱不禁风
如何让浏览器不做校验<form action="" method="post" novalidate>
"""
def index(request):# 1 先产生一个空对象form_obj = MyForm()if request.method == 'POST':# 获取用户数据并且校验"""1.数据获取繁琐2.校验数据需要构造成字典的格式传入才行ps:但是request.POST可以看成就是一个字典"""# 3.校验数据form_obj = MyForm(request.POST)# 4.判断数据是否合法if form_obj.is_valid():# 5.如果合法 操作数据库存储数据return HttpResponse('OK')# 5.不合法 有错误# 2 直接将该空对象传递给html页面return render(request,'index.html',locals()){% for form in form_obj %}<p>{{ form.label }}:{{ form }}<span style="color: red">{{ form.errors.0 }}</span></p>
{% endfor %}"""
1.必备的条件 get请求和post传给html页面对象变量名必须一样 
就是 form_obj = MyForm()  form_obj = MyForm(request.POST) 变量名必须一样
2.forms组件当你的数据不合法的情况下 会保存你上次的数据 让你基于之前的结果进行修改
更加的人性化
"""
# 针对错误的提示信息还可以自己自定制
class MyForm(forms.Form):# username字符串类型最小3位最大8位username = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={'min_length':'用户名最少3位','max_length':'用户名最大8位','required':"用户名不能为空"})# password字符串类型最小3位最大8位password = forms.CharField(min_length=3,max_length=8,label='密码',error_messages={'min_length': '密码最少3位','max_length': '密码最大8位','required': "密码不能为空"})# email字段必须符合邮箱格式  xxx@xx.comemail = forms.EmailField(label='邮箱',error_messages={'invalid':'邮箱格式不正确','required': "邮箱不能为空"})

钩子函数(HOOK)(第二道关卡校验)

"""
在特定的节点自动触发完成响应操作钩子函数在forms组件中就类似于第二道关卡,能够让我们自定义校验规则在forms组件中有两类钩子1.局部钩子当你需要给单个字段增加校验规则的时候可以使用2.全局钩子当你需要给多个字段增加校验规则的时候可以使用
"""
# 实际案例
# 1.校验用户名中不能含有666			只是校验username字段       局部钩子
# 2.校验密码和确认密码是否一致		  password confirm两个字段	全局钩子# 钩子函数
# 局部钩子
def clean_username(self):# 获取用户名username = self.cleaned_data.get('username')    # MyForm.cleaned_dataif '666' in username:# 提示前端展示报错信息self.add_error('username', '不可以说666哦~')     # add_error(字段名,报错信息)# 将钩子函数钩出来的数据再放回去return username# 全局钩子
def clean(self):password = self.cleaned_data.get('password')confirm_password = self.cleaned_data.get('confirm_password')if not confirm_password == password:self.add_error('confirm_password', '两次密码不一致!')# 将钩子函数钩出来的数据再放回去return self.cleaned_data

forms组件其他参数及补充知识点

label				字段名
error_messages  	自定义报错信息
initial  			默认值	相当于default设置个默认值
required  			控制字段是否必填
"""
1.字段没有样式
2.针对不同类型的input如何修改textpassworddateradiocheckbox...
"""
"""
因为前端代码是直接用的 第三种渲染方式渲染的{{ form.label }}:{{ form }}
不是个标签 所以你想加bootstrap加不了 input框中的type类型也没法修改
所以就要运用到一个新参数 widget
EmailInput	---->  type="email"
TextInput   ---->  type="text"
PasswordInput ---> type="password"
...
这些参数就是设置type类型的在后面的括号中可以通过 attr={} 来添加属性  加class、id等等 这样在class里面就能用bootstrap了
"""
widget=forms.widgets.PasswordInput(attrs={'class':'form-control c1 c2'})  # 多个属性值 直接空格隔开即可# 第一道关卡里面还支持正则校验  RegexValidator验证器
from django.core.validators import RegexValidator
phone = forms.CharField(validators=[RegexValidator(r'^[0-9]+$', '请输入数字'),RegexValidator(r'^139[0-9]+$', '数字必须以139开头')])

其他类型渲染(选择框类的)

"""
只要是选择框类的
都是forms.ChoiceField
通过widget参数修改选择框类型
"""

radio类型

gender = forms.ChoiceField(choices=((1, "男"), (2, "女"), (3, "保密")),label="性别",initial=3,widget=forms.widgets.RadioSelect()
)

select单选

hobby = forms.ChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=3,widget=forms.widgets.Select()
)

select多选

hobby1 = forms.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.SelectMultiple()
)

单选checkbox

keep = forms.ChoiceField(label="是否记住密码",initial="checked",widget=forms.widgets.CheckboxInput()
)

多选checkbox

hobby2 = forms.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple()
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.liansuoyi.cn/news/44515185.html

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

springboot使用form标签在两个html页面之间实现界面跳转,出现405问题,但是一刷新就能出现的问题解决

问题描述 在我使用form标签的action属性实现两个html页面之间的跳转,但是出现了这样的问题:问题解决 我尝试将这一块内容去掉:然后再次尝试:页面出来啦~ 问题解决啦~~

存储管理

一、概述 1.1 地址映射(地址重定位)内存中每个存储单元都有一个编号,这个编号称为内存地址(物理地址、绝对地址)。内存地址的集合称为内存空间(物理地址空间)。用户编程所用的地址称为逻辑地址(程序地址、虚地址),由逻辑地址组成的空间称为逻辑地址空间。地址映射:把…

将linux的ip地址设置为固定ip

1.查看ip地址ifconfig 我们此时的ip地址为192.168.124.128,如果我们不设置为固定的,等下次开启时,ip地址可能会变2.编辑ens33网卡的配置信息 在窗户输入以下内容回车,进入编辑界面vi /etc/sysconfig/network-scripts/ifcfg-ens33 进入配置文件,进行修改 修改后的文件为:…

我的数据仓库与数据挖掘期末大作业重置版

这是之前已经完成的任务,原本是我的数据仓库与数据挖掘课程的作业。里面都是比较入门的东西,没什么难度。之前学这门课的时候,上了一整个学期的课,几乎都在讲解数学原理。作为数学科目挂了四门的工科蠢材,我整个学期都听得云里雾里,到了学期末的时候突然告诉我们说期末大…

2023-2024-1 20231317《计算机基础与程序设计》第四周学习总结

作业信息这个作业属于哪个课程 <班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2023-2024-1计算机基础与程序设计第四周作业)这个作业的目标 <《C语言程序设计第三章》>作业正文 ... 本博客链接 https://www.cn…

laravel:访问redis(10.27.0)

一,相关文档: https://learnku.com/docs/laravel/10.x/redis/14887 二,php代码 1,配置.env 使用默认的设置: REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 2,controller中引用:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25<?phpna…

0xGame 2023【WEEK2】Crypto全解

中间的那个人 题目信息 from secret import flag from Crypto.Util.number import * from Crypto.Cipher import AES from hashlib import sha256 from random import *p = getPrime(128) g = 2 A = getrandbits(32) B = getrandbits(32)Alice = pow(g,A,p) Bob = pow(g,B,p) k…

0xGame 2023【WEEK1】Crypto全解

Whats CBC? 题目信息 from Crypto.Util.number import * from secret import flag,keydef bytes_xor(a,b):a,b=bytes_to_long(a),bytes_to_long(b)return long_to_bytes(a^b)def pad(text):if len(text)%8:return textelse:pad = 8-(len(text)%8)text += pad.to_bytes(1,big)*…

Microservice: Service Discovery

一个服务可以拥有多个实例(Instance),每个实例会引用不同的ip地址。这种情况下,我们将无法知道应该访问哪个。所以我们就需要Discovery Service来管理这些地址。 Discovery Service的工作原理

多年没有遇到如此流畅的面试了

美东一公司的面试,有多年没有遇到如此流畅的面试了。 本来说的面试时间是 30 分钟,这个还是第一轮处于电话面试那种,但是不知道为什么最后面试整个时间都延长到了快一个小时,貌似双方都还继续沟通下,有点意犹未尽的感觉。 互相了解 通常第一轮面试的过程都是互相了解。 这…

MinGW安装

1、进入官网:https://sourceforge.net/projects/mingw/?source=typ_redirect 下载安装WinGW 2、安装需要的package 3、配置环境变量

网易云音乐、将某个歌单的所有音乐迁移(复制)到另一个歌单 ,以“我喜欢的音乐”为例

把某个歌单上的所有歌曲转移到另一个账号的歌单上的实现方法。如“我喜欢的音乐”,总共5522首。创了个新号,想把所有音乐重新添加一遍网易云音乐、复制(迁移)某个歌单,将所有音乐粘贴至另一个歌单,以“我喜欢的音乐”为例 我的需求 想把某个歌单上的所有歌曲转移到另一个…

线段是否相交

快速排斥 快速排除不可能相交的情况 123, 4但类似下面这类情况,矩形区域相交,但线段没相交的就无法处理了 跨立实验 若两线段相交,则两线段必须跨立。就是:线段a1a2与线段b1b2相交,则a1和a2一定在线段b1b2的两侧。 2d向量叉乘v1v2,可以用来判断v2在v1的右手逆时针180度内…

P2415 集合求和

1.题目介绍2.题解至于为何\(C_{3}^{0}+C_{3}^{1}+C_{3}^{2}+C_{3}^{3} = 2^{3}\) 可以使用数学归纳法: 1.对于\(C_{0}^{0} = 2^0\) 2.假设对于n = k,\(C_{k}^{0}+C_{k}^{1}+C_{k}^{2}+...+C_{k}^{k} = 2^{k}\)成立 3.对于n = k + 1, \(C_{k+1}^{0}+C_{k+1}^{1}+C_{k+1}^{2}+…

401 Kubernetes网络 (Pod Service Calico Flannel) 4.1-4.4

一、Pod网络 在K8S集群里,多个节点上的Pod相互通信,要通过网络插件完成,比如Calico网络插件。 使用kubeadm初始化K8S集群时,需要指定一个参数--pod--network-cidr=10.18.0.0/16 它用来定义Pod的网段。配置Calico的时候,也要定义CALICO_IPV4POOL_CIDR的参数,它的值也是Pod…

前端大量复杂数据存储探索

引入 最近有需求做一个在B端的长期数据储存方案,主要是需要将大量数据结构化储存,避免每一次启动都去服务端重复拉取数据 第一个想到的前端持久化数据存储方案理所当然想到localstorage,但是它有一个最大5M的空间限制,这大小远远不够,因此我们将视线转移到前端数据库,半年…

单调栈0

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。 栈…

latex学习笔记

latex的学习笔记Latex学习 在线LaTeX编辑器:https://www.overleaf.com TeX Live下载:https://www.tug.org/texlive/acquire-iso.html 适用于大文件 \命令名{参数} 文档类型 begin之前为前文,begin与end之间为正文 maketitle生成文档标题 \documentclass[UTF8]{ctexart}\titl…

redis其他操作、redis管道、django中使用redis、django缓存、celery介绍、补充单例

redis其他操作 delete(*names) exists(name) keys(pattern=*) expire(name ,time) rename(src, dst) move(name, db)) randomkey() type(name)# redis的key值,最大可以是多少? 最大不超过512M 一般 1KB # redis的value值,最大可以是多少? 最大不超过512Mimport redis co…

经纬恒润推出全新一代智能电动座椅模块

随着智能驾驶、智能座舱的广泛应用,人们对于汽车的定位不再局限于代步工具,对于汽车座舱这个私密空间也有了不一样的期待。 随着智能驾驶、智能座舱的广泛应用,人们对于汽车的定位不再局限于代步工具,对于汽车座舱这个私密空间也有了不一样的期待。更安全、更舒适、更…
推荐文章