Form与ModelForm-下拉框或者多选注意//及字段补充
一、Form
设计一张普通model表:
class UserInfo(models.Model):
name = models.CharField(verbose_name='员工姓名', max_length=16)
username = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=64)
email = models.EmailField(verbose_name='邮箱', max_length=64)
depart = models.ForeignKey(verbose_name='部门', to="Department")
现在我们将這个表 继承form:
class UserInfoForm(Form):
name = fields.CharField(required=True,error_messages={'required':'用户名不能为空'})
email = fields.EmailField(required=True)
生成了form以后,我们可以在前端直接使用form类的实例。form帮我们生成了标签,然后再前端进行渲染。
那么问题就来了,如果我想给model表中的depart生成一个下拉框,该如何使用form进行生成呢?
容易想到的就是 如下:
class UserInfoForm(Form):
name = fields.CharField(required=True,error_messages={'required':'用户名不能为空'})
email = fields.EmailField(required=True)
depart = fields.ChoiceField(choices=Department.object.value_list('id','title'))
但是上面存在一个问题,那就是新添加的数据无法在页面上显示出来,只有当项目重启之后,才会显示最新添加的结果。我们来分析一下原因:
我们知道,类中,除了方法或函数以外,在程序执行过程中,类也会执行,也就是说,当执行到UserInForm类的时候,会依次进行实例化name,email,depart这三个变量,注意,当实例化depart变量的时候,会进行数据库操作,也就是说,只要程序不重启,這个取出数据永远只是第一次程序期启动时取出的数据。既然,我们发现了问题,那么就有两种结局措施。
Solution 1:
from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.forms.models import ModelChoiceField
from app01 import models class UserInfoForm(Form):
name = fields.CharField(required=True,error_messages={'required':'用户名不能为空'})
email = fields.EmailField(required=True)
part = fields.ChoiceField()
def __init__(self,*args,**kwargs):
super(UserInfoForm,self).__init__(*args,**kwargs)
self.fields['part'].choices = models.Department.objects.values_list('id','title')
延迟取数据操作,也就是说,取数据每次发生在实例化的时候!
Solutiion 2:
from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.forms.models import ModelChoiceField
from app01 import models class UserInfoForm(Form): name = fields.CharField(required=True,error_messages={'required':'用户名不能为空'})
email = fields.EmailField(required=True)
part = ModelChoiceField(queryset=models.Department.objects.all())
用内置的ModelChoiceField来进行实例化,這个实例化过程与上面的两步是等价!
二、Form字段类型补充
1、内置Form可选类型
BooleanField CharField(maxlength) ChoiceField TypedChoiceField DateField/DateTimeField(auto_now,auto_now_add)
DecimalField DurationField EmailField FileField(upload_to) FilePathField FloatField(max_digits,decimal_places)
ImageField(upload_to) IntegerField GenericIPAddressField MultipleChoiceField TypedMultipleChoiceField
NullBooleanField RegexField SlugField TimeField URLField UUIDField MultiValueField SplitDateTimeField
ModelChoiceField ModelMultipleChoiceField
2.可选属性
required # 取消必填 如:forms.CharField(required=False)
label #取消默认名称 如:forms.CharField(label='Your name')
initial # 给标签赋初值 如:url = forms.URLField(initial='http://')
import datetime
day = forms.DateField(initial=datetime.date.today)
widget#给标签添加属性
如:comment = forms.CharField(widget=forms.Textarea) #将默认的input框变为textarea
help_text#添加提示信息 如sender = forms.EmailField(help_text='A valid email address, please.')
error_messages#name = forms.CharField(error_messages={'required': 'Please enter your name'})
Form与ModelForm-下拉框或者多选注意//及字段补充的更多相关文章
- 关于easyui combobox下拉框实现多选框的实现
好长时间没有更博了,一是因为最近真的比较忙,二是因为自己是真的偷懒了,哈哈 好啦,这篇博客主要是总结一些关于easyui combobox下拉框实现多选框的实现,包括前台界面的展示,和后台对数据的获取 ...
- 使用 Select2 下拉框实现复选
使用 Select2 下拉框实现复选 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...
- 在vue中的form表单中下拉框中的数据来自数据库查询到的数据
文章目录 1.实现的效果: 2.前端html代码 3.js中的代码 4.后端的方法 1.实现的效果: 增加一个新的类型到数据库 2.前端html代码 需要注意的部分:prop后边是表单中的字段 v-m ...
- extjs下拉框添加复选框
给ComboBox组件配置listConfig 下拉框代码: var gyslxcm = Ext.create('Ext.form.field.ComboBox',{ id : 'gyslxcm', ...
- JS-日期框、下拉框、全选复选框
<!-- 下拉框 --><link rel="stylesheet" href="static/ace/css/chosen.css" /&g ...
- 纯css美化下拉框、复选框以及单选框样式并用jquery获取到其被选中的val
具体样式如图所示: 注:获取val值时记得要先引入jquery库奥. 1.下拉框 css部分 #cargo_type_id{ font-size: 13px; border: solid 1px #b ...
- LigerUI ligerComboBox 下拉框 表格 多选无效
$("#txt1").ligerComboBox({ width: 250, slide: false, selectBoxWidth: 500, selectBoxHeight: ...
- angularJs(2)表单中下拉框单选多选
多选 <input type="checkbox" ng-model='game' ng-true-value="1" ng-false-value=&q ...
- WindowsForm ComboBoxList 下拉框带复选框 可以动态添加
先来张效果图: 1.这里需要对控件进行重写,详细内容如下,对此不感兴趣的可以直接跳过这步,下载本人生成的dll,直接看第二小结,下载链接https://pan.baidu.com/s/1gfzrK5t ...
随机推荐
- 差分约束系统专题 && 对差分约束系统的理解
具体能解决的问题: 求最长路,最短路,或者判断解是否存在. 在建边的时候: 一般是给你区间减法的关系,或者是这个点到另一个点的关系.如果给你的关系是除法的话,我们可以通过使用两边同时取log的方式,将 ...
- cin.get()和cin.getline()之间的区别
cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别. cin.get()每次读取一整行并把由Enter键生成的换行符留在输 ...
- 用jquery实现toast的原理
function toast(mess){ var str='<div class="mess"><span></span></div&g ...
- qt 零星笔记
1.qt中堆栈对象的销毁 名字不对,我不知道该取个什么名字,暂且这样吧 在linux c编程中谈到过进程的内存映像,一个进程在内存中的映像如下
- jQuery.Validate 验证,以及 remote验证, 多参数传递
jQuery.Validate 验证: http://www.runoob.com/jquery/jquery-plugin-validate.html 教程网址,很简单, 今天主要在这里记录一下re ...
- linux下补丁制作及打补丁实例【转】
转自:http://www.latelee.org/using-gnu-linux/diff-and-patch-on-linux.html 搞ARM有一段时日了,期间看了不少开发板的手册,手册的内容 ...
- u-boot移植随笔(7):u-boot启动流程简图【转】
转自:http://www.latelee.org/porting-uboot/u-boot-porting-bootstrap.html u-boot移植随笔:u-boot启动流程简图 画上面这张图 ...
- Serv-U 的升级及数据备份和迁移【转】
Serv-U 配置备份 在serv-u7.x及以上版本安装目录下,有一个文件Serv-U.Archive是serv-u的配置文件,有一个users文件夹是Serv-U的域和用户的信息,那么我们只需 ...
- Flask:cookie 和 session (0.1)
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 Cookie是什么?有什么用? 某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常 ...
- Go 命令行总结
go build:已当前目录作为package进行编译,将当前目录下的所有文件编译成package文件,文件名与所在的目录同名. go install: 分两步操作:1.先执行go build进行编译 ...