python-day76--django-Form组件
django中Form组件
1. 用户请求数据验证
2. 自动生成错误信息
3. 打包用户提交正确信息
4. 错误:保留上次输入内容
5. 定制页面上显示的HTML标签 引入:
from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.core.validators import RegexValidator
1. 创建类 -继承Form
2. 字段 要与 数据库中的字段一样
- required=True
- min_length=3
- max_length=18
- error_messages={'required':'不能为空','min_length':'长度不能小于3','max_length':'长度不能大于18','invalid':'格式错误'}
- widget=widgets.TextInput(attrs={'placeholder':'姓名','class':'c1'} #自动创建标签及属性
CheckboxInput/DateInput/NumberInput/PasswordInput/TimeInput/URLInput/DateTimeInput/EmailInput/FileInput/HiddenInput
-validators=[RegexValidator('\d+','只能是数字') ] #对于某个字段进行正则匹配,第一个参数是匹配规则,第二个参数是如果匹配错误要显示的信息(没有error_messages内的invalid优先级高)
3. form=Form() #不传参实例化,只是创建标签
4. form=Form(data=request.POST) #把POST里的数据打包放到一起
5. form=Form(initial={'sid':student_obj.sid,'name':student_obj.name}) #Form实例化时初始值设置
6. form.is_valid() #进行数据校验
7. form.cleaned_data #校验成功的数据 字典形式
8. form.errors #校验错误的数据 是个对象 'obj.errors.字典键.0 ' 获取第一个错误信息 9. Form组件 在创建类的时候造成的数据不同步,解决方法:重写构造方法-每次实例化的时候都重新从数据库内取值
方式一:推荐 list=fields.MultipleChoiceField(choices=[])
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['list'].choices=models.Class.objects.values_list('id','name')
#choices 有自带的校验功能,如果前端传过来的值不在models.Class.objects.values_list('id','name') 范围内,就会提示错误 方式二: from django.forms.models import ModelChoiceField
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2)) 10.遇到的问题:班主任/讲师 的属性: 任课班级字段 修改时的默认值设置 'list':[i.id for i in teacher_obj.class_set.all()] #[1,2,3]
11.在模板中form.as_p 会把自定义Form类内的所有字段按照p标签生成 form.as_table / form.as_ul 不推荐
12.Form扩展: 钩子函数:如果在自定义类中定义 def clean_字段名(上方的定义的字段)方法,那么这个函数就会在校验当前字段名时(自带的正则校验后)自动执行,
可以在此函数中再次进行对数据库的相关判断,因为正则校验不能连接数据库 注意:
必须有返回值
只能拿自己当前字段值
raise ValidationError('xxx') 代码部分
from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01 import models class LoginForm(Form):
username = fields.CharField(
required=True,
min_length=3,
max_length=18,
error_messages={
'required': '用户不能为空',
'min_length': '用户长度不能小于3',
'max_length': '用户长度不能大于18',
}
)
password = fields.CharField(
required=True,
min_length=3,
max_length=18,
error_messages={
'required': '密码不能为空',
'min_length': '密码长度不能小于3',
'max_length': '密码长度不能大于18',
'invalid': '密码格式错误',
},
validators=[RegexValidator('\d+','只能是数字') ]
) def clean_username(self): #在校验username字段时 自动执行
# ...
user = self.cleaned_data['username']
is_exsit = models.UserInfo.objects.filter(username=user).count()
if not is_exsit:
raise ValidationError('用户名不存在')
return user #如果存在 就把前面得到的user值返回给函数就行了,django会把该函数的返回值赋值给 cleaned_data['username'] → cleaned_data['username']=user def clean_password(self): #在校验password字段时 自动执行
user = self.cleaned_data['username']
return user def login(request):
if request.method == "GET":
form = LoginForm()
return render(request,'login.html',{'form':form})
elif request.method =="POST":
form = LoginForm(data=request.POST)
if form.is_valid():
# 验证成功
user = models.UserInfo.objects.filter(**form.cleaned_data).first()
if not user:
# 用户名或密码错误
# 主动向form中添加错误信息
#方法1
# form.add_error('password','用户名或密码错误') #向password字段的错误信息中添加
#方法2 - 官方方法
form.add_error('password',ValidationError('用户名或密码错误')) return render(request, 'login.html', {'form': form})
else:
request.session[settings.SJF] = {'id':user.id, 'username':user.username}
return redirect('/index/')
else:
# 验证失败
return render(request, 'login.html',{'form':form})
else:
return HttpResponse('滚')
python-day76--django-Form组件的更多相关文章
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- python 终极篇 --- form组件 与 modelForm
form组件 ...
- Django—Form组件
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
- django form组件 cookies,session
django form组件 渲染标签 就是组件里面的字段在前端展示叫做渲染标签 校验数据 用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
- Python - Django - form 组件基本用法
普通 form 表单的处理: reg.html: <!DOCTYPE html> <html lang="en"> <head> <met ...
- Web框架django[Form]组件
新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...
- 32.Django form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
随机推荐
- 题解——洛谷P1250 种树(差分约束)
一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...
- 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning
论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning 2017-06-06 21: ...
- 论文阅读之: Hierarchical Object Detection with Deep Reinforcement Learning
Hierarchical Object Detection with Deep Reinforcement Learning NIPS 2016 WorkShop Paper : https://a ...
- $mount方法是用来挂载我们的Vue.extend扩展的
html <body> <div id="app"> <diy></diy> </div> </body> ...
- 用.native修饰器来对外部组件进行构造器内部方法的调用以及用原生js获取构造器里的方法
html <div id="app"> <span v-text="number"></span> <btn @cli ...
- Derek解读Bytom源码-孤块管理
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- Redis,Memcache比较
简单比较: Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储.memcache只支持简单的K/V类型数据, 不过memcache可以缓存其他东西如图片, ...
- Machine.config与web.config
应用范围的不同 结点介绍 原理介绍 异常 web.config详解
- TensorFlow 安装以及python虚拟环境
python虚拟环境 由于TensorFlow只支持某些版本的python解释器,如Python3.6.如果其他版本用户要使用TensorFlow就必须安装受支持的python版本.为了方便在不同项目 ...
- MD5加密与Hash加密
一.Md5加密 MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字 ...