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 ...
随机推荐
- 【leetcode 简单】 第八十题 3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...
- Anaconda+django写出第一个web app(三)
前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...
- HDU 1242 Rescue (广搜)
题目链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The priso ...
- sklearn_k邻近分类_KNeighborsClassifier
# coding:utf-8 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNei ...
- shell脚本-监控及邮件提醒
首先写一个邮件提醒python文件 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.m ...
- 通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解
0x1 工具和环境介绍 dvwa:渗透测试环境 BurpSuite:强大的WEB安全测试工具 sqlmap:强大的sql注入工具 以上工具和环境都在kali linux上安装和配置. 0x2 步骤说明 ...
- Floyd_Warshall算法
Floyd_Warshall算法主要用于求解所有节点对的最短路径,代码如下: #include<iostream> using namespace std; #define Inf 655 ...
- mysql -> 事务&事务锁_09
事务的特性 redo undo 锁的隔离级别
- go语言项目汇总
Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...
- 缓存数据库-redis数据类型和操作(string)
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) 一:String(字符串) string是redis ...