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类时,主要涉及到 [ ...
随机推荐
- Latex: 添加IEEE会议论文作者信息
参考: Multiple Authors with common affiliations in IEEEtran conference template Latex: 添加IEEE会议论文作者信息 ...
- Java常见异常:Exception in thread "main" java.lang.NoClassDefFoundError
在某一路径下执行编译好的class文件出错. 异常如下: E:\liwy>java Test98 Exception in thread "main" java.lang.N ...
- Intellij idea创建maven项目并配置tomcat
今天刷知乎的时候刷到这么一句话 我觉得还是蛮有趣的,形容的也比较到位,正好最近新建maven项目进行了thrift数据的传输,在此做一个记录 首先idea整合了maven,不需要单独下载 新建一个Pr ...
- nginx,uwsgi,部署django,静态文件不生效问题
打开浏览器,然后访问服务器,如果能够正常访问,并且页面链接可以跳转,但是页面却是乱的,那一定是nginx.conf里面的静态文件配置不正确, location /static/ {#expires 3 ...
- Tp5.1使用导出Excel
composer require phpoffice/phpexcel 不管它的警告,都能用的. use PHPExcel; use PHPExcel_IOFactory; public static ...
- ZZNU 正约数之和
#include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #incl ...
- Ajax_请求get,post案例
1. 最原始的ajax请求方式 (1). get请求 <%@ Page Language="C#" AutoEventWireup="true" Code ...
- [原][osg][osgearth]倾斜摄影1.介绍
总体介绍: 倾斜摄影就是将拍好的数据,三角网格化再附上贴图. 目前流行处理软件: Street Factory.PIX4DMapper.smart3D 后期开发平台:超图 Skyline smart3 ...
- HTML标记 2 ——表格
<table width="800" border="0"> -----------------------表开头 <tr> ...
- 用原生js来处理跨域的数据(jsonp)
说明总结: 1.ajax和jsonp其实本质上是不同的东西.ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提 ...