一、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. 【leetcode 简单】 第八十题 3的幂

    给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...

  2. Anaconda+django写出第一个web app(三)

    前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...

  3. HDU 1242 Rescue (广搜)

    题目链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The priso ...

  4. sklearn_k邻近分类_KNeighborsClassifier

    # coding:utf-8 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNei ...

  5. shell脚本-监控及邮件提醒

    首先写一个邮件提醒python文件 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.m ...

  6. 通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解

    0x1 工具和环境介绍 dvwa:渗透测试环境 BurpSuite:强大的WEB安全测试工具 sqlmap:强大的sql注入工具 以上工具和环境都在kali linux上安装和配置. 0x2 步骤说明 ...

  7. Floyd_Warshall算法

    Floyd_Warshall算法主要用于求解所有节点对的最短路径,代码如下: #include<iostream> using namespace std; #define Inf 655 ...

  8. mysql -> 事务&事务锁_09

    事务的特性 redo undo 锁的隔离级别

  9. go语言项目汇总

    Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...

  10. 缓存数据库-redis数据类型和操作(string)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) 一:String(字符串) string是redis ...