django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm

关于django的表单系统,主要分两种

  • 基于django.forms.Form
  • 基于django.forms.ModelForm

表单API

表单有两种状态,绑定,未绑定 Form.is_bound()
Form.is_valid()
验证表单数据是否合法,返回True或者False

Form.errors 错误字典

Form.has_error(field,code=None)

Form.initial 在表单未绑定的情况下,为表单字段设置初始值,

  1. >>> f=ContactForm(initial={'subject':'Hi there'})

Form.has_changed() 检查表单数据是否变化

From.cleaned_data 表单通过验证后,可以使用cleaned_data属性来访问‘清洁’的数据

Form.as_p() 将表单渲染成< p >标签
From.as_ul() 将表单渲染成< ul >标签
From.as_table() 将表单渲染成< table > 标签
但是这些都得自己添加<table ></table>;< ul >< /ul >标签

设置表单必填行与错误行的样式

Form.error_css_class
Form.required_css_class

  1. from django import forms
  2. class ContactForm(Form):
  3. error_css_class = 'error' #错误行样式在HTML中表示class='error'
  4. required_css_class = 'required' #必填样式在Html中表示clss=‘required’

然后在css文件中定义error与required类就行了

配置表单元素的HTML id属性,< label >标签

Form.auto_id

  1. >>> f = ContactForm(auto_id=False) #这样在html中表单不包含< label >标签
  2. >>> f = ContactForm(auto_id=True) #在html中表单<label>标签将为每个表单的id
  3. >>> f = ContactForm(auto_id='id_for_%s') #在html中表单<label>标签为id_for_字段id

From.prefix 可以为Django表单添加一个命名空间

  1. >>> mother = PersonForm(prefix='mother')
  2. >>> father = PersonForm(prefix='father')

Field.required 表示该字段为必填 缺省为必填项,如需要指定不为必须

  1. >>> f=forms.CharField(required=True)

Field.label 表示友好的label,表单在页面显示时用到它

  1. name=from.CharField(label="Your name")

Field.help_text 显示字段描述文本

Field.error_message 覆盖默认的错误信息

  1. name = forms.CharField(error_messages={'required':'Please enter your name'}) #覆盖required的默认错误信息
widget

widget 负责渲染网页上的HTML表单

设置weidget实例样式 利用widget.attrs

  1. class CommentForm(forms.Form):
  2. name=forms.CharField(widget=forms.TextInput(attrs={'class':'special'}))
  3. comment = forms.CharField(widget= forms.TextInput(attrs={'size':'40'}))

自定义了name字段的输入样式为类 special
comment更改的大小为40

内建的weidget

TextInput
NumberInput
EmailInput
URLInput
PasswprdInput
HiddenInput
DateInput 日期
DateTimeInput 日期/时间
TimeInput 时间
Textarea
CheckboxInput
Select
NullBooleanSelect 渲染成 unknown,yes,no三个选项
SelectMultiple
RadioSelect
CheckboxSelectMultiple 复选框列表
FileInput 文件上传
SelectDateWidget

ModelForm表单

  1. from django.forms import ModelForm
  2. from myapp.models import Article
  3. class ArticleForm(ModelForm):
  4. class Meta:
  5. model = Article #表单对应的model
  6. fields = ['pub_date', 'headline', 'content', 'reporter'] #表单中显示的字段,对应models.py中对应的字段

使用的时候可以如下:

  1. >>>form = ArticleForm()
  2. >>>article = Article.objects.get(pk=1)
  3. >>>form = ArticleForm(instance = article) #赋值instance可以使form表单是可以接受对象的数据

save()方法

每一个ModelForm都有一个save()方法,这个方法可以更具绑定的form表单创建并且保存一个数据库对象,ModelForm的子类可以接受一个model的子类作为instance的参数,如果存在那么save()方法会更新这个实例,否则会创建一个新的实例

save(commit=False)

save()方法接受一个commit的参数,其值为True或者False。默认为True。
如果你声明 save(commit=False),那么它就会返回一个还未保存至数据库的对象,这样的话 你可以用这个对象添加一些额外的数据,然后在用save()保存到数据库

  1. def edit(request,sid):
  2. edit_obj = get_object_or_404(PointRule,id=sid)
  3. if request.method == 'POST':
  4. form = PointRuleForm(request.POST.copy(),instance=edit_obj)
  5. if form.is_valid():
  6. point = form.save(commit=False)
  7. point.update_user = request.user #在form.save(commit=False时,添加一些表单中未有的数据)
  8. point.save()
  9. return redirect('point:index')
  10. else:
  11. messages.error(request, u'数据验证错误')
  12. else:
  13. form = PointRuleForm(instance=edit_obj)
  14. return render(request,'point/edit.html',locals())

save_m2m()方法

在save(commit=False)的时候,如果你的model中含有many-to-many的数据模型,那么你将无法使用save()方法去保存数据,只能使用save_m2m()方法来保存
在为声明ave(commit=False),则不用如此保存,用save()就好了..

Selecting the fields to use

1.选择model中所有字段为表单中的字段

  1. __all__

例子

  1. from django.forms import ModelForm
  2. class AuthorForm(ModelForm)
  3. class Meta:
  4. model = Author
  5. fields='__all__'

2.剔除指定字段的所有数据 exclude

  1. class PartialAuhorForm(ModelForm):
  2. class Meta:
  3. model = Author
  4. exclude = ['title'] #添加Author model中出了titile字段的所有字段至PartialAuhorForm表单

覆盖字段的默认值

  1. form django.forms import ModelForm, Textarea
  2. form myapp.models import Author
  3. class AuthorForm(ModelForm):
  4. class Meta:
  5. model=Author
  6. fields=('name','title','birth_date')
  7. widgets={'name':Textarea(attrs={'cols':80,'rows':20})}

  1. from django.utils.translation import ugettext_lazy as _
  2. class AuthorForm(ModelForm):
  3. class Meta:
  4. model=Author
  5. fields=('name','title','birth_date')
  6. labels = { 'name':_('Writer'), }
  7. help_texts = {'name':_('some useful help text.'),}
  8. error_messages={ 'name':{'max_length':_("this writer name is too long")} }
文/天天稀饭(简书作者)
原文链接:http://www.jianshu.com/p/5664dd79c0ba
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Django ModelForm and Form的更多相关文章

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

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

  2. Django中的ModelForm与Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm. 关于django中的表单系统有两种: 基于django.forms.Form 基于dj ...

  3. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  4. django中的Form和ModelForm中的问题

    django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): ...

  5. 3 django系列之Form表单在前端web界面渲染与入库保存

    author: 温柔易淡(Leo),欢迎技术交流与拍砖 preface 我们在前端写表单的时候,其实可以使用django自带的forms功能来实现,特别是在处理 修改已经存在数据 的场景特别好用,下面 ...

  6. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  7. Django组件之Form表单

    一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...

  8. Django框架之Form组件

    一.初探Form组件 在介绍Form组件之前,让大家先看看它强大的功能吧!Go... 下面我们来看看代码吧! 1.创建Form类 from django.forms import Form from ...

  9. python 全栈开发,Day110(django ModelForm,客户管理之 编辑权限(一))

    昨日内容回顾 1. 简述权限管理的实现原理. 粒度控制到按钮级别的权限控制 - 用户登陆成功之后,将权限和菜单信息放入session - 每次请求时,在中间件中做权限校验 - inclusion_ta ...

随机推荐

  1. Python的时间模块小结(转自:不懂真人)

    import datetimeprint time.time() #时间戳 print time.localtime(time.time()) #时间元组 print time.strftime('% ...

  2. SVN 分支管理

    平时在工作中使用 SVN 只是限于 commit,update 这样的操作,至多再 reslove 解决一下冲突,没有用过分支管理.开发过程中一般都是一个功能开发完成之后整体进行提交,而最近在项目中有 ...

  3. ios-实现项目在开发、测试、正式环境快速部署

    快速部署:简单的来说,就是不用更改开发.测试.正式环境下的 url ,来实现在同一台测试手机快速部署三种项目状态. Bundle ID一样只会出现一个app:不一样会出现三个app: 具体步骤: 一. ...

  4. Mac OS X 懒人版安装教程(之前的图全部挂了,所以重发了)

    请版主把我之前发的那个帖子删了!因为所有的图全部挂了,所以麻烦版主了…… 安装中出现五国的话就请进入这里看看是那里的错误http://bbs.pcbeta.com/viewthread-863656- ...

  5. Java 隐藏和覆盖

    我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...

  6. smarty模板原理和增删改查例题

    Smarty模板:(前后端分离)原理:核心是一个类,先修改配置文件,在使用的时候引入配置文件即可,(init.inc.php)$smarty->assign("ceshi", ...

  7. easyUI loyout tabs自适应宽度

    index.html 页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  8. swift流行UI库(github)

    http://www.cocoachina.com/ios/20161109/18007.html

  9. favicon.ico的制作

    1.选取需要的图片(jpg的格式等) 2.在网上搜索favicon.ico的制作,将jpg转为ico 3.在html中输入<link rel="shortcut icon" ...

  10. iOS,plist文件、pct文件,工程设置

    1.使用pch文件 2.在info.plist中配置URL Schemes 3.plist配置拍照界面,复制,粘贴等菜单的显示语言 显示中文 4.使用非ARC库/ARC库 5.链接选项-Objc &a ...