app01/models.py:

  1. from django.db import models
  2.  
  3. class UserInfo(models.Model):
  4. username = models.CharField(max_length=16)
  5. password = models.CharField(max_length=16)
  6. mobile = models.CharField(max_length=11)
  7.  
  8. class City(models.Model):
  9. name = models.CharField(max_length=16, null=False, unique=True)

往 City 表中添加数据

这时候需要重启服务才能在页面上显示这些内容

也就是说每次数据库中的内容更新,都需要重启服务才能显示出来

可以通过重写父类中的 __init__ 方法来解决

views.py:

  1. from django.shortcuts import render, HttpResponse
  2. from app01 import models
  3.  
  4. from django import forms
  5. from django.forms import widgets
  6. from django.core.validators import RegexValidator
  7. from django.core.exceptions import ValidationError
  8.  
  9. class RegForm(forms.Form):
  10. username = forms.CharField(
  11. min_length=5,
  12. label="用户名",
  13. error_messages={
  14. "min_length": "用户名不能小于5位!",
  15. "required": "该字段不能为空"
  16. },
  17. widget=widgets.TextInput(attrs={"class": "form-control"})
  18. )
  19.  
  20. password = forms.CharField(
  21. min_length=6,
  22. label="密码",
  23. error_messages={
  24. "min_length": "密码不能少于6位!",
  25. "required": "该字段不能为空"
  26. },
  27. widget=widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True)
  28. )
  29.  
  30. re_password = forms.CharField(
  31. min_length=6,
  32. label="确认密码",
  33. error_messages={
  34. "required": "该字段不能为空"
  35. },
  36. widget=widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True)
  37. )
  38.  
  39. mobile = forms.CharField(
  40. label="手机号",
  41. # 自定义正则匹配规则
  42. validators=[
  43. RegexValidator(r'^[0-9]+$', "手机号必须是数字"), # 判断手机号是否为数字
  44. RegexValidator(r'^1[3-9][0-9]{9}$', "手机格式有误") # 判断手机号是否为 1 和 3-9 开头的十一位数
  45. ],
  46. error_messages={
  47. "required": "该字段不能为空",
  48. },
  49. widget=widgets.TextInput(attrs={"class": "form-control"})
  50. )
  51.  
  52. city = forms.ChoiceField(
  53. choices=models.City.objects.values_list("id", "name"),
  54. label="城市",
  55. initial=2,
  56. widget=widgets.Select()
  57. )
  58.  
  59. # 重写父类的 __init__ 方法
  60. def __init__(self, *args, **kwargs):
  61. super().__init__(*args, **kwargs)
  62. self.fields['city'].widget.choices = models.City.objects.values_list("id", "name")
  63.  
  64. # 判断用户名信息
  65. def clean_username(self):
  66. value = self.cleaned_data.get("username")
  67. if "admin" in value:
  68. raise ValidationError("用户名不能含有敏感信息")
  69.  
  70. # 重写父类的 clean 方法
  71. def clean(self):
  72. password = self.cleaned_data.get("password")
  73. re_password = self.cleaned_data.get("re_password")
  74. if re_password != password:
  75. self.add_error("password", ValidationError("两次密码不一致"))
  76. self.add_error("re_password", ValidationError("两次密码不一致"))
  77. raise ValidationError("两次密码不一致")
  78. return self.cleaned_data
  79.  
  80. def reg2(request):
  81. form_obj = RegForm() # GET 请求
  82.  
  83. if request.method == "POST":
  84. form_obj = RegForm(request.POST)
  85. # 让 form 来帮我们进行校验
  86. if form_obj.is_valid():
  87. # 如果通过校验
  88. # 所有经过校验的数据都保存在 form_obj.cleaned_data
  89. print(form_obj.cleaned_data)
  90. models.UserInfo.objects.create(**form_obj.cleaned_data)
  91. return HttpResponse("注册成功")
  92.  
  93. return render(request, "reg2.html", {"form_obj": form_obj})

运行结果:

Python - Django - form 组件动态从数据库取 choices 数据的更多相关文章

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

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

  2. Python - Django - form 组件内置的正则校验器

    app01/models.py: from django.db import models class UserInfo(models.Model): username = models.CharFi ...

  3. Python - Django - form 组件校验功能

    app01/models.py: from django.db import models class UserInfo(models.Model): username = models.CharFi ...

  4. Python - Django - form 组件自定义校验

    reg2.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. Python - Django - form 组件常用的字段和字段参数

    邮箱: views.py: from django import forms from django.forms import widgets class RegForm(forms.Form): e ...

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

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

  7. 9.24 Django Form组件

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

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

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

  9. django Form组件

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

随机推荐

  1. mysql查询语句中使用星号真的慢的要死?

    前言 之所以写这篇文章,是源于以前看过的关于sql语句优化的帖子,里面明确提到了在sql语句中不要使用 * 来做查询,就像下面的规则中说的 2.尽量避免使用select *,返回无用的字段会降低查询效 ...

  2. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  3. httprunner学习9-完整的用例结构(yaml&json)

    前言 前面几篇零散的学了一些httprunner的知识点,那么一个完整的 YAML/JSON 用例文件包含哪些关键字呢? 测试用例结构 在 HttpRunner 中,测试用例组织主要基于三个概念: 测 ...

  4. 阿里巴巴Java开发手册(格式规约篇)——查自己的漏-补自己的缺

    (三) 格式规约 1. [强制]大括号的使用约定.如果是大括号内为空,则简洁地写成{}即可,不需要换行:如果是非空代码块则: 1) 左大括号前不换行.行. 2) 左大括号后换行. 3) 右大括号前换行 ...

  5. BAT脚本一键启动多个程序

    最近写代码,开机要开各种环境,IDE,每次都要对着桌面图标一个个点击,感觉非常麻烦,简直浪费生命,每天开机要花好几分钟打开这些东西,于是稍微学习了一下window下的bat脚本语言,写了一个极为简单而 ...

  6. router.beforeEach、路由元信息、导航守卫与函数式编程

    一.函数的识别: 1.router.beforeEach:主函数.高阶函数.入口函数: 2.匿名参量函数:处理跳转过程中的附加逻辑 (to, from, next) => { if (to.ma ...

  7. trait Monad:函数式编程类型系统本博客搜索关键字--类型升降

    trait Monad:函数式编程类型系统本博客搜索关键字--类型升降

  8. es6 -- rest 参数

    es6 引入了rest参数(形式:...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中. function ...

  9. PostgreSQL 执行计划

    简介 PostgreSQL是“世界上最先进的开源关系型数据库”.因为出现较晚,所以客户人群基数较MySQL少,但是发展势头很猛,最大优势是完全开源. MySQL是“世界上最流行的开源关系型数据库”.当 ...

  10. JavaScript 中 call()、apply()、bind() 的用法

    "use strict"; ; var obj = { name:'小李', age:, getInfo(from, to) { console.log(arguments) co ...