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 ...
随机推荐
- 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...
- jenkins 相关默认信息
(1) 默认安装目录 /usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里. ( 2 ) 默认配置文件 /etc/sysconfig/jenkins:jenkins ...
- Metrics.Net实践(2)在WEB中应用度量
Gauges 可以画出Http Request执行时间的波形图: actionInfo表示MVC中的Action,即按照action类型来分组 Metric.Context(this.actionIn ...
- 简单的多对一传输ns2仿真
实验名称:简单的多对一传输仿真 实验目的:1.研究怎么实现多对一传输. 实验步骤: 1.写c++代码并注册报文头. 先说一下多对一传输的方式.最开始,接收端发送控制报文给所有的发送端,告诉他们要发送多 ...
- 基本控件文档-UITextField属性
CHENYILONG Blog 基本控件文档-UITextField属性 Fullscreen UITextField属性技术博客http://www.cnblogs.com/ChenYilong ...
- Dream------scala--函数定义、流程控制、异常处理
Dream------scala--函数定义.流程控制.异常处理 一.函数的定义 1.新建工程
- 在jsp中接收并处理servlet传过来的含有bean的List
在jsp中接收并处理servlet传过来的含有bean的List 例如有以下bean package com.test.domain; class Student{ private Stirng na ...
- marshmallow: 简化Python对象系列化
转载:http://www.thinksaas.cn/topics/0/594/594368.html marshmallow -一个轻量级的库用于将复杂对象转成简单的Python数据类型.或从简单的 ...
- C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定
思路来源:http://bbs.csdn.NET/topics/390819824,引用该页面某网友提供的方法. 题目:我现在有100个任务,需要多线程去完成,但是要限定同时并发数量不能超过5个. 原 ...
- Vim 编辑文件时,突然断开链接
centos 系统 编辑文本 突然退出 ,恢复文档操作: 有道笔记链接地址