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的更多相关文章

  1. Django-Form组件-forms.ModelForm

    froms.ModelForm 具有models操作数据库字段的功能,还具有Form的功能.较Form组件而言,根据model自动生成Form. 使用注册的案例进行初步认识 # 使用ModelForm ...

  2. Django学习之八:forms组件【对form舒心了】

    目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...

  3. django 表单系统 之 forms.ModelForm

    继承forms.ModelForm类实现django的表单系统 有时,我们在前端定义的<form>表单和后端定义的model结构基本上是一样的,那么我们可以直接在后端定义model后,定义 ...

  4. Django之forms.ModelForm

    通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单. 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中. 在这种情 ...

  5. Django框架——forms.ModelForm使用

    使用模型创建表单 django提供了这种简便的方式,使用方法如下: 1.在项目的一个app目录中,创建forms.py文件 2.导入模块: from django import forms from ...

  6. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  7. Django 用ModelForm批量保存form表单(非常实用的方法) mfor_verity项目

    1.先看一下 Model 非常多 from django.db import models from users.models import UserProfile # Create your mod ...

  8. Umbraco Forms 使Rendering Forms scripts 在不同的template中

    具体请参考 https://our.umbraco.org/documentation/products/umbracoforms/developer/Rendering-Scripts/ 转载 ht ...

  9. django基础 -- 10.form , ModelForm ,modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

随机推荐

  1. Java并发编程原理与实战五:创建线程的多种方式

    一.继承Thread类 public class Demo1 extends Thread { public Demo1(String name) { super(name); } @Override ...

  2. SQL - 查询某一字段值相同而另一字段值最大的记录

    有时需要以某一字段作为分组,筛选每一组的另一字段值最大(或最小)的记录.例如,有如下表 app,存储了 app 的 ID.名称.版本号等信息.现在要筛选出每个 app 版本最大的记录. 方法一 SEL ...

  3. 第一回 java~简介

    Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...

  4. JHipster项目启动后默认的8080主页是空白页面?

    1.背景 根据官网一步步地生成项目,他喵的启动后居然是一个空白页面,这怎么玩啊?还有这种操作的吗?跟说好的不一样啊!关于JHipster资料,国内少的可怜,几乎都是同一样的东西,纯介绍的文章,只好上s ...

  5. Understanding the Space Used by ZFS -- (转)

    Understanding the Space Used by ZFS By Brian Leonard on Sep 28, 2010 Until recently, I've been confu ...

  6. UNIX网络编程 第3章 套接字编程简介

    套接字结构类型和相关的格式转换函数

  7. linux nginx大量TIME_WAIT的解决办法--转

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 8535 CLOSE_WAIT 5 FIN ...

  8. The Art of Memory Forensics-Windows取证(Virut样本取证)

    1.前言 The Art of Memory Forensics真是一本很棒的书籍,其中使用volatility对内存进行分析的描述可以辅助我们对更高级类的木马进行分析和取证,这里对书中的命令进行了笔 ...

  9. java map遍历并删除特定值

    删除map中包含password和username的键值对 若是在map中直接删除,会指针错误 Iterator<Map.Entry<String,Object>> it = ...

  10. Extjs 基础篇—— Function 能在定义时就能执行的方法的写法 function(){...}()

    Ext.js 中 Function能在定义时就能执行的方法的写法 function(){...}() /** * 第二部分Function:能在定义时就能执行的方法的写法 function(){... ...