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组件的更多相关文章

  1. django Form组件

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

  2. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

  3. 6月28日 Django form组件 和 modelform组件

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

  4. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  5. Django—Form组件

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

  6. django form组件 cookies,session

    django form组件 渲染标签  就是组件里面的字段在前端展示叫做渲染标签 校验数据  用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...

  7. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

  8. Python - Django - form 组件基本用法

    普通 form 表单的处理: reg.html: <!DOCTYPE html> <html lang="en"> <head> <met ...

  9. Web框架django[Form]组件

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

  10. 32.Django form组件

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

随机推荐

  1. Dockerize a .NET Core application

    Dockerize a .NET Core application Introduction This example demonstrates how to dockerize an ASP.NET ...

  2. Wijmo 2017路线图

    2016年是Wijmo团队发展和增长的另一个富有成效的一年.回顾我们2016年的路线图,您可以看到我们交付了我们承诺的一切.让我们回顾一下2016年的亮点: 我们第一个全面支持Angular 2 互操 ...

  3. -第2章 JS方法实现下拉菜单显示和隐藏

    知识点 onmouseover 鼠标经过 onmouseout 鼠标移出 function 关键字 getElementsByTagName 获取一组标签 length 获取对象成员个数 思路 给一级 ...

  4. Centos 7下添加新用户并授权

    1.创建一个 xiaoyang 用户 [root@VM_81_181_centos ~]# adduser xiaoyang 2.为创建的用户设置密码 [root@VM_81_181_centos ~ ...

  5. git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git

    项目上有一个分支test,使用git branch -a看不到该远程分支,直接使用命令git checkout test报错如下: error: pathspec 'origin/test' did ...

  6. mesh合并

    [风宇冲]Unity3D性能优化:DrawCall优化 (2013-03-05 15:39:27) 转载▼ 标签: it unity unity3d unity3d教程 分类: Unity3d之优化 ...

  7. sublime text3 license

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F6 ...

  8. hdu 1392 Surround the Trees 凸包裸题

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. sublime3 mac : Package Control There are no packages available for installation

    如下问题: 查看控制台:点击 ctrl+`打开控制台 发现是因为http://packagecontrol.io/channel_v3.json 获取失败,手动下载channel_v3.json文件, ...

  10. vuex里mapState,mapGetters使用详解

    这次给大家带来vuex里mapState,mapGetters使用详解,vuex里mapState,mapGetters使用的注意事项有哪些,下面就是实战案例,一起来看一下. 一.介绍 vuex里面的 ...