1、数据源无法时时更新,有两种方法

方式一:重构构造方法(推荐)

  1. 方法一:重构构造方法(推荐)
  2. class ClassesForm(Form):
  3. name = fields.CharField(
  4. required=True, # 必填字段
  5. error_messages={"required": "姓名不能为空!!"}, # 显示中文错误提示
  6. widget=widgets.TextInput(attrs={"placeholder": "姓名", "class": "form-control"}), # 自动生成input框
  7. )
  8. # 如果直接定义成classteacher_id,,_id 的形式,这样你添加数据的时候不会时时更新,所以在下面定义一个重写的方法
  9. # classteacher_id = fields.ChoiceField(choices= models.UserInfo.objects.filter(ut_id = settings.ROLE_CLASSTEACHER).values_list('id', "username"))
  10.  
  11. classteacher_id = fields.ChoiceField(choices=[])
  12. def __init__(self,*args,**kwargs): #重写init方法,时时更新
  13. super().__init__(*args,**kwargs) #继承父类

  14. self.fields["classteacher_id"].choices = models.UserInfo.objects.filter(ut_id = settings.ROLE_CLASSTEACHER).values_list('id', "username")
  15. 注意:
  16. 要是这样:fields.ChoiceField(choices=[])
  17. 注意choices里面传[(1,"讲师"),(2,"班主任"),(3,"管理员")]所以数据库里取的时候得用values_list

方式二:

  1. 方法二:ModelChoiceField(不推荐),queryset
  2. from django.forms.models import ModelChoiceField #先导入
  3. class ClassForm(Form):
  4. caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
  5. # headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
  6. headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))

2、Form基本使用


  1. 字段
  2. is_valid()
  3. cleaned_data
  4. errors
  5. 字段参数:
  6. max_length
  7. min_length
  8. validators = [RegexValidators("xxx")]
  9.  
  10. 钩子函数
  11. clean_字段名
  12. 注意:
  13. 必须有返回值
  14. 只能拿自己当前字段值
  15. raise ValidationError("xxx")
  16. 下拉框数据源时时更新
  17. 1、重写init方法
  18. 先执行父类构造方法
  19. self.fields["xx"].choices = xxxxx
  20. 2ModelChoiceField

3、用户登录

  1. - form的字段可以定义正则表达式
  2. password = fields.CharField(
  3. required=True,
  4. min_length=3,
  5. max_length=18,
  6. error_messages={
  7. 'required': '密码不能为空',
  8. 'min_length': '密码长度不能小于3',
  9. 'max_length': '密码长度不能大于18',
  10. 'invalid': '密码格式错误',
  11. },
  12. validators=[RegexValidator('\d+','只能是数字') ]
  13. )
  14. 注意:error_messages的优先级比validators

需要导入的模块

  1. from django.forms import Form
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.conf import settings
  5. from django.core.validators import ValidationError
  6. from django.core.validators import RegexValidator
  1. class LoginForm(Form):
  2. username = fields.CharField(
  3. required=True, #必填字段
  4. min_length=3,
  5. max_length=16,
  6. error_messages={
  7. "required":"用户名不能为空",
  8. "min_length":"长度不能小于3",
  9. "max_length":"长度不能大于16"
  10. },
  11. widget=widgets.TextInput({"placeholder":"username","class":"form-control"})
  12. )
  13. password = fields.CharField(
  14. required=True,
  15. min_length=3,
  16. max_length=16,
  17. error_messages={
  18. "required": "密码不能为空",
  19. "min_length": "密码长度不能小于3",
  20. "max_length": "密码长度不能大于16",
  21. # "invalid":"密码格式错误"
  22. # error_messages的优先级高,如果写上"invalid":"密码格式错误"这个就会优先显示这个错误
  23. },
  24. widget=widgets.PasswordInput({"placeholder":"password","class":"form-control"}),
  25. validators=[RegexValidator("\d+","密码只能是数字")] #可以进行正则匹配提示错误
  26. )
  27.  
  28. def clean_username(self):
  29. user = self.cleaned_data["username"]
  30. is_exits = models.UserInfo.objects.filter(username=user).count()
  31. if not is_exits:
  32. raise ValidationError("用户名和密码错误")
  33. return user #必须有return

views.py ---------login

  1. def login(request):
  2. if request.method == "GET":
  3. form = LoginForm()
  4. return render(request, "login.html", {"form": form})
  5. else:
  6. form = LoginForm(data=request.POST)
  7. if form.is_valid():
  8. print(form.cleaned_data)
  9. # username = form.cleaned_data["username"]
  10. # password = form.cleaned_data["password"]
  11. # user = models.UserInfo.objects.filter(username=username, password=password).first()
  12. user = models.UserInfo.objects.filter(**form.cleaned_data).first()
  13. if user: #这次是和数据库里的数据进行比较
  14. #验证成功
  15. print(user.username)
  16. request.session[settings.GDP] = {"id":user.id,"username":user.username} #设置session
  17. return redirect("/teacherindex/")
  18. else:
  19. #验证失败,就给增加一个错
  20. form.add_error("password","用户名或密码不正确")
  21. return render(request, "login.html", {"form": form})
  22. else:
  23. return render(request, "login.html", {"form": form})

- 主动向form中添加错误信息
  # form.add_error('password','用户名或密码错误')
  form.add_error('password',ValidationError('用户名或密码错误'))
  这两个都可以,建议用第二个

4、Form扩展(钩子函数)

如果对username做扩展
#先做正则表达式判断
#然后自定义方法验证:也就是clean_xx,称为钩子函数

  1. def clean_username(self):
  2. #可以写自己的验证提示
  3. 不像validators只写正则表达式。在这里可以随意写
  4. user=self.clean_data["username"]
  5. is_esits = models.UserInfo.objects.filter(username=user).count()
  6. if not is_esits:
  7. raise validationError("用户名不存在")
  8. return user #必须有返回值
  9. 如果 def clean_password(self): 只能取password字段的值
  10. 如果 def clean_username(self): 只能取username字段的值
  11. 注意:在自己写钩子函数的时候,只能拿自己的字段不能拿别人的
  12. 每一种字段就可以用 正则+自定义正则+自定义钩子函数
  13.  
  14. # 注意:
      clean_xx(self):pass 局部钩子函数
      clean(self):pass    全局钩子函数
  15.  
  16. 例子:

1、局部钩子函数

  1. def clean_username(self):
  2. username = self.cleaned_data.get("username")
  3. valid = models.UserInfo.objects.filter(username = username).first()
  4. if valid:
  5. raise ValidationError("用户名已存在")
  6. return username

2、全局钩子函数

  1. #自定义全局钩子:验证两次密码是否一致
  2. def clean(self):
  3. if self.cleaned_data.get("password") == self.cleaned_data.get("password_again"):
  4. return self.cleaned_data
  5. else:
  6. raise ValidationError("两次密码不一致")
  1.  

Django之Form自定义验证规则的更多相关文章

  1. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  2. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  3. yii2中的rules 自定义验证规则详解

    yii2的一个强大之处之一就是他的Form组件,既方便又安全.有些小伙伴感觉用yii一段时间了,好嘛,除了比tp"难懂"好像啥都没有. 领导安排搞一个注册的功能,这家伙刷刷刷的又是 ...

  4. validatebox自定义验证规则以及使用

    //===============jsp======state==== //开启验证 <script  type="text/javascript"> ​​​​​​​y ...

  5. Jquery Validate自定义验证规则,一个汉字等于两个字符长度

    使用Jquery validate时写的一些东西,在这里做个笔记 在使用 Jquery validate 的minlength和maxlength进行文本框内容长度验证的时候,对于一个汉字的长度检测结 ...

  6. easyui的validatebox重写自定义验证规则的几个实例

    validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...

  7. thinkPHP5.0验证器自定义验证规则

    自定义验证规则 protected $rule = [ 'views' => 'require|number|checkviews:0',//checkviews为自定义验证规则,0是传过去的规 ...

  8. Jquery Validate 相关参数及常用的自定义验证规则

    一.官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 二.默认校验规则 1 2 3 4 5 6 7 8 9 10 1 ...

  9. YII开发技巧分享——模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规 ...

随机推荐

  1. MySQL Unable to convert MySQL date/time value to System.DateTime的解决办法

    在连接串中加入 Convert Zero Datetime=True

  2. 简单的可兼容所有浏览器的操作html元素的javascript框架

    1.根据id名称取元素  $id(idName) 2.根据class定义取元素  $class(className)返回所有class被定义成className的元素数组,或者$Eclass(clas ...

  3. IntelliJ IDEA 同时启动多个Tomcat实例端口是会冲突

  4. 2017 google IO大会——5.17

    大家好! 每年一度的全球互联网及新型技术的盛会 Google IO,今年的大会日期和地址已经公布了:大会将在5月17至19日在谷歌公司总部边上的会场,美国加州 Mountain View的 Shore ...

  5. 从结果推断过程----->使用System.out和Root Device

    刚才解决了一个App中更新的逻辑问题.出问题之后发现,有很多处调用了更新,后来都不知道是哪里改写了SharedPreferences. 然后一直在挨个寻找每一处更新的地方,花了很多时间. 最后直接使用 ...

  6. oracle Instant Client install

    Installation See the Instant Client Home Page for more information. Installation of ZIP files: 1. Do ...

  7. [转载]Windows网络编程系列教程之四:Select模型

    原文:http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103 讲一下套接字模式和套接字I/O模型的区别.先说明一 ...

  8. BZOJ3784:树上的路径

    浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...

  9. shell里的` ` $( ) ${ } expr $(( ))

    转自:http://blog.sina.com.cn/s/blog_6151984a0100ekz2.html 所有UNIX命令,要取结果或输出,都要用$( )或反引号` ` tt=` file te ...

  10. NLB

    http://www.cnblogs.com/allegro/archive/2011/02/11/1951171.html