Python - Django - form 组件动态从数据库取 choices 数据
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 表中添加数据
这时候需要重启服务才能在页面上显示这些内容
也就是说每次数据库中的内容更新,都需要重启服务才能显示出来
可以通过重写父类中的 __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 组件基本用法
普通 form 表单的处理: reg.html: <!DOCTYPE html> <html lang="en"> <head> <met ...
- Python - Django - form 组件内置的正则校验器
app01/models.py: from django.db import models class UserInfo(models.Model): username = models.CharFi ...
- Python - Django - form 组件校验功能
app01/models.py: from django.db import models class UserInfo(models.Model): username = models.CharFi ...
- Python - Django - form 组件自定义校验
reg2.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- Python - Django - form 组件常用的字段和字段参数
邮箱: views.py: from django import forms from django.forms import widgets class RegForm(forms.Form): e ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
随机推荐
- mysql查询语句中使用星号真的慢的要死?
前言 之所以写这篇文章,是源于以前看过的关于sql语句优化的帖子,里面明确提到了在sql语句中不要使用 * 来做查询,就像下面的规则中说的 2.尽量避免使用select *,返回无用的字段会降低查询效 ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- httprunner学习9-完整的用例结构(yaml&json)
前言 前面几篇零散的学了一些httprunner的知识点,那么一个完整的 YAML/JSON 用例文件包含哪些关键字呢? 测试用例结构 在 HttpRunner 中,测试用例组织主要基于三个概念: 测 ...
- 阿里巴巴Java开发手册(格式规约篇)——查自己的漏-补自己的缺
(三) 格式规约 1. [强制]大括号的使用约定.如果是大括号内为空,则简洁地写成{}即可,不需要换行:如果是非空代码块则: 1) 左大括号前不换行.行. 2) 左大括号后换行. 3) 右大括号前换行 ...
- BAT脚本一键启动多个程序
最近写代码,开机要开各种环境,IDE,每次都要对着桌面图标一个个点击,感觉非常麻烦,简直浪费生命,每天开机要花好几分钟打开这些东西,于是稍微学习了一下window下的bat脚本语言,写了一个极为简单而 ...
- router.beforeEach、路由元信息、导航守卫与函数式编程
一.函数的识别: 1.router.beforeEach:主函数.高阶函数.入口函数: 2.匿名参量函数:处理跳转过程中的附加逻辑 (to, from, next) => { if (to.ma ...
- trait Monad:函数式编程类型系统本博客搜索关键字--类型升降
trait Monad:函数式编程类型系统本博客搜索关键字--类型升降
- es6 -- rest 参数
es6 引入了rest参数(形式:...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中. function ...
- PostgreSQL 执行计划
简介 PostgreSQL是“世界上最先进的开源关系型数据库”.因为出现较晚,所以客户人群基数较MySQL少,但是发展势头很猛,最大优势是完全开源. MySQL是“世界上最流行的开源关系型数据库”.当 ...
- JavaScript 中 call()、apply()、bind() 的用法
"use strict"; ; var obj = { name:'小李', age:, getInfo(from, to) { console.log(arguments) co ...