一、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-下拉框或者多选注意//及字段补充的更多相关文章

  1. 关于easyui combobox下拉框实现多选框的实现

    好长时间没有更博了,一是因为最近真的比较忙,二是因为自己是真的偷懒了,哈哈 好啦,这篇博客主要是总结一些关于easyui combobox下拉框实现多选框的实现,包括前台界面的展示,和后台对数据的获取 ...

  2. 使用 Select2 下拉框实现复选

    使用 Select2 下拉框实现复选 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...

  3. 在vue中的form表单中下拉框中的数据来自数据库查询到的数据

    文章目录 1.实现的效果: 2.前端html代码 3.js中的代码 4.后端的方法 1.实现的效果: 增加一个新的类型到数据库 2.前端html代码 需要注意的部分:prop后边是表单中的字段 v-m ...

  4. extjs下拉框添加复选框

    给ComboBox组件配置listConfig 下拉框代码: var gyslxcm = Ext.create('Ext.form.field.ComboBox',{ id : 'gyslxcm', ...

  5. JS-日期框、下拉框、全选复选框

    <!-- 下拉框 --><link rel="stylesheet" href="static/ace/css/chosen.css" /&g ...

  6. 纯css美化下拉框、复选框以及单选框样式并用jquery获取到其被选中的val

    具体样式如图所示: 注:获取val值时记得要先引入jquery库奥. 1.下拉框 css部分 #cargo_type_id{ font-size: 13px; border: solid 1px #b ...

  7. LigerUI ligerComboBox 下拉框 表格 多选无效

    $("#txt1").ligerComboBox({ width: 250, slide: false, selectBoxWidth: 500, selectBoxHeight: ...

  8. angularJs(2)表单中下拉框单选多选

    多选 <input type="checkbox" ng-model='game' ng-true-value="1" ng-false-value=&q ...

  9. WindowsForm ComboBoxList 下拉框带复选框 可以动态添加

    先来张效果图: 1.这里需要对控件进行重写,详细内容如下,对此不感兴趣的可以直接跳过这步,下载本人生成的dll,直接看第二小结,下载链接https://pan.baidu.com/s/1gfzrK5t ...

随机推荐

  1. Ubuntu: HDF5报错: HDF5 header version与HDF5 library不匹配

    今天在执行一个用到hdf5的python脚本时,遇到如下错误 Warning! ***HDF5 library version mismatched error*** The HDF5 header ...

  2. Mac 下 gzip 一个文件

    gzip -k xxx.json -k 会保留源文件

  3. linux可运行的shell脚本与设置开机服务启动(自己总结)

    完整的ln命令参考:http://www.runoob.com/linux/linux-comm-ln.html ln :创建连接文件 - 默认创建的是硬连接,好比复制 ,但是两个文件会同步 命令:l ...

  4. Python标准库内置函数complex介绍

    from:http://www.jb51.net/article/57798.htm 本函数可以使用参数real + imag*j方式创建一个复数.也可以转换一个字符串的数字为复数:或者转换一个数字为 ...

  5. Python Webdriver 重新使用已经打开的浏览器实例

    因为Webdriver每次实例化都会新开一个全新的浏览器会话,在有些情况下需要复用之前打开未关闭的会话.比如爬虫,希望结束脚本时,让浏览器处于空闲状态.当脚本重新运行时,它将继续使用这个会话工作.还就 ...

  6. linux用户权限 -> 系统基本权限

    比如rwxr-xr-x linux中正是这9个权限位来控制文件属主(User).属组(Group).其他用户(Other)基础权限. 用户对资源来说, 有三种角色 User(u): 属主用户(文件所有 ...

  7. github 优秀的开源项目

    https://github.com/wlcaption/AndroidMarket---- 这是手机应用商店,包含应用的下载,用户中心等内容 https://github.com/wlcaption ...

  8. 使用Docker快速搭建sftp服务

    一.安装docker环境 参见 http://www.cnblogs.com/rslai/p/8403350.html 二.从Docker Hub查找sftp镜像 docker search sftp ...

  9. java基础72 junit单元测试

    1.junit要注意的细节 1.如果junit测试一个方法,在junit窗口上显示绿色代表测试成功:如果显示红条,则代表测试方法出现异常不通过.    2.如果点击方法名.包名.类名.工程名运行jun ...

  10. epoll测试实例

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...