forms.ModelForm 与 forms.Form
1. 首先 两者都是forms里的常用类。
2. 这两个类在应用上是有区别的。一般情况下,如果要将表单中的数据写入数据库或者修改某些记录的值,就要让表单类继承ModelForm; 如果提交表单后 不会对数据库就行修改,则继承Form类。
两则的区别可能是,继承了ModelForm,在数据保存的时候 可以这样保存。不需要models.XXX.objects.create(),
register_form = RegistrationForm(request.POST)
if register_form.is_valid():
# 带有前台传的数据的RegistrationForm对象,用new_user.save()直接可以保存,参数意思是不提交数据库,需要后面在提交
new_user = register_form.save(commit=False)
new_user.set_password(register_form.cleaned_data['password'])
new_user.save()
3. 在实际运用中,出现了一些问题,记录下来,以便日后查看。
问题一:对继承ModelForm 类的表单初始化值时,报错...
初始状态:
# 表单类
class UserInfoForm(forms.ModelForm):
company = fields.CharField()
school = fields.CharField()
phone = fields.CharField()
address = fields.CharField()
desc = fields.CharField(
widget=widgets.Textarea,
)
user_info = UserInfo.objects.get(user=request.user)
user_info_form = UserInfoForm(initial={
'school': user_info.school,
'company': user_info.company,
'phone': user_info.phone,
'address': user_info.address,
'desc': user_info.desc
})
# 在初始化值的时候 出现了错误....
File "E:\django学习\boke\account\views.py", line 90, in personal_data
'desc': user_info.desc
File "C:\Python35\lib\site-packages\django\forms\models.py", line 295, in __init__
raise ValueError('ModelForm has no model class specified.')
ValueError: ModelForm has no model class specified.
[08/Apr/2018 19:38:24] "GET /account/personal_data/ HTTP/1.1" 500 79115
解决办法:
class UserInfoForm(forms.ModelForm):
company = fields.CharField()
school = fields.CharField()
phone = fields.CharField()
address = fields.CharField()
desc = fields.CharField(
widget=widgets.Textarea,
)
class Meta:
model = UserInfo
fields = ('company', 'school', 'phone', 'address', 'desc')
# 表单类中需要加model=UserInfo 指向那个models类,及类中的那些字段。
问题二: 如果fields = ('password', 'email',) 用了两个字段,但在前台展示时,只用到一个如email,那么前台提交时,能否提交??
答案:不可以,前台需要用几个字段,这里就写几个 如 fields = ( 'email',), 多用到的字段,即使前台不用,提交时,form.is_valid() 也会验证。
试想,对于 forms.Form 如果表单类 有4个字段 且必填, 如果前台值用到四个,那么想必 form.is_valid() 同样不会通过。待验证...
4. 对form表单初始化值
if request.method == 'GET':
obj = models.ArticlePost.objects.get(id=nid)
print(obj.column.column)
form_article_obj = ArticlePostForm(initial={'title': obj.title, 'body': obj.body}) # 初始化input
form_column_obj = EditArticleColumnForm(initial={'column': obj.column.id}) # 初始化下拉菜单,用id
columns = models.ArticleColumn.objects.all()
return render(request, 'article/article_list_edit.html',
{'article_form': form_article_obj,
'nid': nid,
'column_form': form_column_obj,
'columns': columns,
'have_column': obj.column
})
forms.ModelForm 与 forms.Form的更多相关文章
- Django-Form组件-forms.ModelForm
froms.ModelForm 具有models操作数据库字段的功能,还具有Form的功能.较Form组件而言,根据model自动生成Form. 使用注册的案例进行初步认识 # 使用ModelForm ...
- Django学习之八:forms组件【对form舒心了】
目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...
- django 表单系统 之 forms.ModelForm
继承forms.ModelForm类实现django的表单系统 有时,我们在前端定义的<form>表单和后端定义的model结构基本上是一样的,那么我们可以直接在后端定义model后,定义 ...
- Django之forms.ModelForm
通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单. 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中. 在这种情 ...
- Django框架——forms.ModelForm使用
使用模型创建表单 django提供了这种简便的方式,使用方法如下: 1.在项目的一个app目录中,创建forms.py文件 2.导入模块: from django import forms from ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Django 用ModelForm批量保存form表单(非常实用的方法) mfor_verity项目
1.先看一下 Model 非常多 from django.db import models from users.models import UserProfile # Create your mod ...
- Umbraco Forms 使Rendering Forms scripts 在不同的template中
具体请参考 https://our.umbraco.org/documentation/products/umbracoforms/developer/Rendering-Scripts/ 转载 ht ...
- django基础 -- 10.form , ModelForm ,modelformset
一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...
随机推荐
- C++持有Object-C对象时容易内存泄露
在IOS项目中,可以将C++与Object-C混编,不过必须放在实现文件.mm中. 在.mm中,我们可能创建了一个C++对象A,而它持有一个Object-C对象B作为成员变量.当A对象被释放掉的时候, ...
- Matlab debug
输入彩色,imwrite保存黑白图片,imwrite的维度错误. 程序如下,正常图像,少了一个维度imwrite,把图片展开,是一个二维的灰色图像(R=G=B),.如果限定了第二维,也是一个灰色图像. ...
- JavaScript 数组元素排序
var sortArray = new Array(3,6,8888,66); // 元素必须是数字 sortArray.sort(function(a,b){return a-b}); // a-b ...
- Java并发编程原理与实战二十四:简易数据库连接池
public class MyDataSource { private static LinkedList<Connection> pool = new LinkedList<> ...
- Spring Boot后台启动不打印nohup.out
#!/bin/bashnohup java -jar websocket-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod --serve ...
- HDU 4720 Naive and Silly Muggles 平面几何
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 解题报告:给出一个三角形的三个顶点坐标,要求用一个最小的圆将这个三个点都包含在内,另外输入一个点 ...
- HDU 1561 The more, The Better (有依赖背包 || 树形DP)
题目链接 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位 ...
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)
题目链接 题目翻译: 给出一个数n,和一个浮点数a,数n代表全集U = {1,2,...,n},然后给出 M个U的子集,如果一个集合B(是U的子集),M个集合中有至少M*a个集合包含B, 则B这个集合 ...
- UNIX环境高级编程 第10章 信号
SIGSTOP和SIGKILL区别是:前者是使进程暂时停止,即中止,也就是说使进程暂停,将进程挂起,比如你在终端里面执行一个脚本或者程序,执行到一半,你想暂停一下,你按下ctrl+z,就会导致终端发送 ...
- Sicily 1211. 商人的宣传
题目链接:http://soj.me/1211 Description Bruce是K国的商人,他在A州成立了自己的公司,这次他的公司生产出了一批性能很好的产品,准备宣传活动开始后的第L天到达B州进行 ...