Django之Form自定义验证规则
1、数据源无法时时更新,有两种方法
方式一:重构构造方法(推荐)
- 方法一:重构构造方法(推荐)
- class ClassesForm(Form):
- name = fields.CharField(
- required=True, # 必填字段
- error_messages={"required": "姓名不能为空!!"}, # 显示中文错误提示
- widget=widgets.TextInput(attrs={"placeholder": "姓名", "class": "form-control"}), # 自动生成input框
- )
- # 如果直接定义成classteacher_id,,_id 的形式,这样你添加数据的时候不会时时更新,所以在下面定义一个重写的方法
- # classteacher_id = fields.ChoiceField(choices= models.UserInfo.objects.filter(ut_id = settings.ROLE_CLASSTEACHER).values_list('id', "username"))
- classteacher_id = fields.ChoiceField(choices=[])
- def __init__(self,*args,**kwargs): #重写init方法,时时更新
- super().__init__(*args,**kwargs) #继承父类
- self.fields["classteacher_id"].choices = models.UserInfo.objects.filter(ut_id = settings.ROLE_CLASSTEACHER).values_list('id', "username")
- 注意:
- 要是这样:fields.ChoiceField(choices=[])
- 注意choices里面传[(1,"讲师"),(2,"班主任"),(3,"管理员")]所以数据库里取的时候得用values_list
方式二:
- 方法二:ModelChoiceField(不推荐),queryset
- from django.forms.models import ModelChoiceField #先导入
- class ClassForm(Form):
- caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
- # headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
- headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))
2、Form基本使用
- 类
- 字段
- is_valid()
- cleaned_data
- errors
- 字段参数:
- max_length
- min_length
- validators = [RegexValidators("xxx")]
- 钩子函数
- clean_字段名
- 注意:
- 必须有返回值
- 只能拿自己当前字段值
- raise ValidationError("xxx")
- 下拉框数据源时时更新
- 1、重写init方法
- 先执行父类构造方法
- self.fields["xx"].choices = xxxxx
- 2、ModelChoiceField
3、用户登录
- - form的字段可以定义正则表达式
- password = fields.CharField(
- required=True,
- min_length=3,
- max_length=18,
- error_messages={
- 'required': '密码不能为空',
- 'min_length': '密码长度不能小于3',
- 'max_length': '密码长度不能大于18',
- 'invalid': '密码格式错误',
- },
- validators=[RegexValidator('\d+','只能是数字') ]
- )
- 注意:error_messages的优先级比validators高

需要导入的模块
- from django.forms import Form
- from django.forms import fields
- from django.forms import widgets
- from django.conf import settings
- from django.core.validators import ValidationError
- from django.core.validators import RegexValidator
- class LoginForm(Form):
- username = fields.CharField(
- required=True, #必填字段
- min_length=3,
- max_length=16,
- error_messages={
- "required":"用户名不能为空",
- "min_length":"长度不能小于3",
- "max_length":"长度不能大于16"
- },
- widget=widgets.TextInput({"placeholder":"username","class":"form-control"})
- )
- password = fields.CharField(
- required=True,
- min_length=3,
- max_length=16,
- error_messages={
- "required": "密码不能为空",
- "min_length": "密码长度不能小于3",
- "max_length": "密码长度不能大于16",
- # "invalid":"密码格式错误"
- # error_messages的优先级高,如果写上"invalid":"密码格式错误"这个就会优先显示这个错误
- },
- widget=widgets.PasswordInput({"placeholder":"password","class":"form-control"}),
- validators=[RegexValidator("\d+","密码只能是数字")] #可以进行正则匹配提示错误
- )
- def clean_username(self):
- user = self.cleaned_data["username"]
- is_exits = models.UserInfo.objects.filter(username=user).count()
- if not is_exits:
- raise ValidationError("用户名和密码错误")
- return user #必须有return
views.py ---------login
- def login(request):
- if request.method == "GET":
- form = LoginForm()
- return render(request, "login.html", {"form": form})
- else:
- form = LoginForm(data=request.POST)
- if form.is_valid():
- print(form.cleaned_data)
- # username = form.cleaned_data["username"]
- # password = form.cleaned_data["password"]
- # user = models.UserInfo.objects.filter(username=username, password=password).first()
- user = models.UserInfo.objects.filter(**form.cleaned_data).first()
- if user: #这次是和数据库里的数据进行比较
- #验证成功
- print(user.username)
- request.session[settings.GDP] = {"id":user.id,"username":user.username} #设置session
- return redirect("/teacherindex/")
- else:
- #验证失败,就给增加一个错
- form.add_error("password","用户名或密码不正确")
- return render(request, "login.html", {"form": form})
- else:
- return render(request, "login.html", {"form": form})
- 主动向form中添加错误信息
# form.add_error('password','用户名或密码错误')
form.add_error('password',ValidationError('用户名或密码错误'))
这两个都可以,建议用第二个
4、Form扩展(钩子函数)
如果对username做扩展
#先做正则表达式判断
#然后自定义方法验证:也就是clean_xx,称为钩子函数
- def clean_username(self):
- #可以写自己的验证提示
- 不像validators只写正则表达式。在这里可以随意写
- user=self.clean_data["username"]
- is_esits = models.UserInfo.objects.filter(username=user).count()
- if not is_esits:
- raise validationError("用户名不存在")
- return user #必须有返回值
- 如果 def clean_password(self): 只能取password字段的值
- 如果 def clean_username(self): 只能取username字段的值
- 注意:在自己写钩子函数的时候,只能拿自己的字段不能拿别人的
- 每一种字段就可以用 正则+自定义正则+自定义钩子函数
- # 注意:
clean_xx(self):pass 局部钩子函数
clean(self):pass 全局钩子函数- 例子:
1、局部钩子函数
- def clean_username(self):
- username = self.cleaned_data.get("username")
- valid = models.UserInfo.objects.filter(username = username).first()
- if valid:
- raise ValidationError("用户名已存在")
- return username
2、全局钩子函数
- #自定义全局钩子:验证两次密码是否一致
- def clean(self):
- if self.cleaned_data.get("password") == self.cleaned_data.get("password_again"):
- return self.cleaned_data
- else:
- raise ValidationError("两次密码不一致")
Django之Form自定义验证规则的更多相关文章
- Django【第16篇】:Django之Form组件自定义验证规则
自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...
- yii2中自定义验证规则rules
作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...
- yii2中的rules 自定义验证规则详解
yii2的一个强大之处之一就是他的Form组件,既方便又安全.有些小伙伴感觉用yii一段时间了,好嘛,除了比tp"难懂"好像啥都没有. 领导安排搞一个注册的功能,这家伙刷刷刷的又是 ...
- validatebox自定义验证规则以及使用
//===============jsp======state==== //开启验证 <script type="text/javascript"> y ...
- Jquery Validate自定义验证规则,一个汉字等于两个字符长度
使用Jquery validate时写的一些东西,在这里做个笔记 在使用 Jquery validate 的minlength和maxlength进行文本框内容长度验证的时候,对于一个汉字的长度检测结 ...
- easyui的validatebox重写自定义验证规则的几个实例
validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...
- thinkPHP5.0验证器自定义验证规则
自定义验证规则 protected $rule = [ 'views' => 'require|number|checkviews:0',//checkviews为自定义验证规则,0是传过去的规 ...
- Jquery Validate 相关参数及常用的自定义验证规则
一.官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 二.默认校验规则 1 2 3 4 5 6 7 8 9 10 1 ...
- YII开发技巧分享——模型(models)中rules自定义验证规则
YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规 ...
随机推荐
- MySQL Unable to convert MySQL date/time value to System.DateTime的解决办法
在连接串中加入 Convert Zero Datetime=True
- 简单的可兼容所有浏览器的操作html元素的javascript框架
1.根据id名称取元素 $id(idName) 2.根据class定义取元素 $class(className)返回所有class被定义成className的元素数组,或者$Eclass(clas ...
- IntelliJ IDEA 同时启动多个Tomcat实例端口是会冲突
- 2017 google IO大会——5.17
大家好! 每年一度的全球互联网及新型技术的盛会 Google IO,今年的大会日期和地址已经公布了:大会将在5月17至19日在谷歌公司总部边上的会场,美国加州 Mountain View的 Shore ...
- 从结果推断过程----->使用System.out和Root Device
刚才解决了一个App中更新的逻辑问题.出问题之后发现,有很多处调用了更新,后来都不知道是哪里改写了SharedPreferences. 然后一直在挨个寻找每一处更新的地方,花了很多时间. 最后直接使用 ...
- oracle Instant Client install
Installation See the Instant Client Home Page for more information. Installation of ZIP files: 1. Do ...
- [转载]Windows网络编程系列教程之四:Select模型
原文:http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103 讲一下套接字模式和套接字I/O模型的区别.先说明一 ...
- BZOJ3784:树上的路径
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...
- shell里的` ` $( ) ${ } expr $(( ))
转自:http://blog.sina.com.cn/s/blog_6151984a0100ekz2.html 所有UNIX命令,要取结果或输出,都要用$( )或反引号` ` tt=` file te ...
- NLB
http://www.cnblogs.com/allegro/archive/2011/02/11/1951171.html