Python Django form 组件动态从数据库取choices数据实例


Posted in Python onMay 19, 2020

app01/models.py:

from django.db import models
 
class UserInfo(models.Model):
  username = models.CharField(max_length=16)
  password = models.CharField(max_length=16)
  mobile = models.CharField(max_length=11)
 
class City(models.Model):
  name = models.CharField(max_length=16, null=False, unique=True)

往 City 表中添加数据

Python Django form 组件动态从数据库取choices数据实例

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

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

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

views.py:

from django.shortcuts import render, HttpResponse
from app01 import models
 
from django import forms
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
 
 
class RegForm(forms.Form):
  username = forms.CharField(
    min_length=5,
    label="用户名",
    error_messages={
      "min_length": "用户名不能小于5位!",
      "required": "该字段不能为空"
    },
    widget=widgets.TextInput(attrs={"class": "form-control"})
  )
 
  password = forms.CharField(
    min_length=6,
    label="密码",
    error_messages={
      "min_length": "密码不能少于6位!",
      "required": "该字段不能为空"
    },
    widget=widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True)
  )
 
  re_password = forms.CharField(
    min_length=6,
    label="确认密码",
    error_messages={
      "required": "该字段不能为空"
    },
    widget=widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True)
  )
 
  mobile = forms.CharField(
    label="手机号",
    # 自定义正则匹配规则
    validators=[
      RegexValidator(r'^[0-9]+$', "手机号必须是数字"), # 判断手机号是否为数字
      RegexValidator(r'^1[3-9][0-9]{9}$', "手机格式有误") # 判断手机号是否为 1 和 3-9 开头的十一位数
    ],
    error_messages={
      "required": "该字段不能为空",
    },
    widget=widgets.TextInput(attrs={"class": "form-control"})
  )
 
  city = forms.ChoiceField(
    choices=models.City.objects.values_list("id", "name"),
    label="城市",
    initial=2,
    widget=widgets.Select()
  )
 
  # 重写父类的 __init__ 方法
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['city'].widget.choices = models.City.objects.values_list("id", "name")
 
  # 判断用户名信息
  def clean_username(self):
    value = self.cleaned_data.get("username")
    if "admin" in value:
      raise ValidationError("用户名不能含有敏感信息")
 
  # 重写父类的 clean 方法
  def clean(self):
    password = self.cleaned_data.get("password")
    re_password = self.cleaned_data.get("re_password")
    if re_password != password:
      self.add_error("password", ValidationError("两次密码不一致"))
      self.add_error("re_password", ValidationError("两次密码不一致"))
      raise ValidationError("两次密码不一致")
    return self.cleaned_data
 
 
def reg2(request):
  form_obj = RegForm() # GET 请求
 
  if request.method == "POST":
    form_obj = RegForm(request.POST)
    # 让 form 来帮我们进行校验
    if form_obj.is_valid():
      # 如果通过校验
      # 所有经过校验的数据都保存在 form_obj.cleaned_data
      print(form_obj.cleaned_data)
      models.UserInfo.objects.create(**form_obj.cleaned_data)
      return HttpResponse("注册成功")
 
  return render(request, "reg2.html", {"form_obj": form_obj})

运行结果:

Python Django form 组件动态从数据库取choices数据实例

以上这篇Python Django form 组件动态从数据库取choices数据实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用mailbox打印电子邮件的方法
Apr 30 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python统计单词出现的次数
Apr 04 Python
python计算两个地址之间的距离方法
Jun 09 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
python3调用windows dos命令的例子
Aug 14 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
Python 实现定积分与二重定积分的操作
May 26 Python
Django自关联实现多级联动查询实例
May 19 #Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 #Python
django 数据库返回queryset实现封装为字典
May 19 #Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 #Python
python 数据分析实现长宽格式的转换
May 18 #Python
如何把外网python虚拟环境迁移到内网
May 18 #Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 #Python
You might like
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
bootstrap表单示例代码分享
2017/05/18 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
详解Python中的join()函数的用法
2015/04/07 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
奥巴马的演讲稿
2014/05/15 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
python实现批量移动文件
2021/04/05 Python
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB