django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm
关于django的表单系统,主要分两种
表单有两种状态,绑定,未绑定 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 2 3 4 | from django import forms class ContactForm ( Form ) : error_css_class = ‘error’ #错误行样式在HTML中表示class=’error’ required_css_class = ‘required’ #必填样式在Html中表示clss=‘required’ |
然后在css文件中定义error与required类就行了
Form.auto_id
1 2 3 | >>> f = ContactForm ( auto_id = False ) #这样在html中表单不包含< label >标签 >>> f = ContactForm ( auto_id = True ) #在html中表单<label>标签将为每个表单的id >>> f = ContactForm ( auto_id = ‘id_for_%s’ ) #在html中表单<label>标签为id_for_字段id |
From.prefix 可以为Django表单添加一个命名空间
1 2 | >>> mother = PersonForm ( prefix = ‘mother’ ) >>> 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 负责渲染网页上的HTML表单
设置weidget实例样式 利用widget.attrs
1 2 3 | class CommentForm ( forms . Form ) : name = forms . CharField ( widget = forms . TextInput ( attrs = { ‘class’ : ‘special’ } ) ) comment = forms . CharField ( widget = forms . TextInput ( attrs = { ‘size’ : ’40’ } ) ) |
自定义了name字段的输入样式为类 special
comment更改的大小为40
TextInput
NumberInput
EmailInput
URLInput
PasswprdInput
HiddenInput
DateInput 日期
DateTimeInput 日期/时间
TimeInput 时间
Textarea
CheckboxInput
Select
NullBooleanSelect 渲染成 unknown,yes,no三个选项
SelectMultiple
RadioSelect
CheckboxSelectMultiple 复选框列表
FileInput 文件上传
SelectDateWidget
1 2 3 4 5 6 | from django . forms import ModelForm from myapp . models import Article class ArticleForm ( ModelForm ) : class Meta : model = Article #表单对应的model fields = [ ‘pub_date’ , ‘headline’ , ‘content’ , ‘reporter’ ] #表单中显示的字段,对应models.py中对应的字段 |
使用的时候可以如下:
1 2 3 | >>> form = ArticleForm ( ) >>> article = Article . objects . get ( pk = 1 ) >>> form = ArticleForm ( instance = article ) #赋值instance可以使form表单是可以接受对象的数据 |
每一个ModelForm都有一个save()方法,这个方法可以更具绑定的form表单创建并且保存一个数据库对象,ModelForm的子类可以接受一个model的子类作为instance的参数,如果存在那么save()方法会更新这个实例,否则会创建一个新的实例
save()方法接受一个commit的参数,其值为True或者False。默认为True。
如果你声明 save(commit=False),那么它就会返回一个还未保存至数据库的对象,这样的话 你可以用这个对象添加一些额外的数据,然后在用save()保存到数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def edit ( request , sid ) : edit_obj = get_object_or_404 ( PointRule , id = sid ) if request . method == ‘POST’ : form = PointRuleForm ( request . POST . copy ( ) , instance = edit_obj ) if form . is_valid ( ) : point = form . save ( commit = False ) point . update_user = request . user #在form.save(commit=False时,添加一些表单中未有的数据) point . save ( ) return redirect ( ‘point:index’ ) else : messages . error ( request , u ‘数据验证错误’ ) else : form = PointRuleForm ( instance = edit_obj ) return render ( request , ‘point/edit.html’ , locals ( ) ) |
在save(commit=False)的时候,如果你的model中含有many-to-many的数据模型,那么你将无法使用save()方法去保存数据,只能使用save_m2m()方法来保存
在为声明ave(commit=False),则不用如此保存,用save()就好了..
1.选择model中所有字段为表单中的字段
1 | __all__ |
例子
1 2 3 4 5 | from django . forms import ModelForm class AuthorForm ( ModelForm ) class Meta : model = Author fields = ‘__all__’ |
2.剔除指定字段的所有数据 exclude
1 2 3 4 | class PartialAuhorForm ( ModelForm ) : class Meta : model = Author exclude = [ ‘title’ ] #添加Author model中出了titile字段的所有字段至PartialAuhorForm表单 |
1 2 3 4 5 6 7 | form django . forms import ModelForm , Textarea form myapp . models import Author class AuthorForm ( ModelForm ) : class Meta : model = Author fields = ( ‘name’ , ‘title’ , ‘birth_date’ ) widgets = { ‘name’ : Textarea ( attrs = { ‘cols’ : 80 , ‘rows’ : 20 } ) } |
1 2 3 4 5 6 7 8 | from django . utils . translation import ugettext_lazy as _ class AuthorForm ( ModelForm ) : class Meta : model = Author fields = ( ‘name’ , ‘title’ , ‘birth_date’ ) labels = { ‘name’ : _ ( ‘Writer’ ) , } help_texts = { ‘name’ : _ ( ‘some useful help text.’ ) , } error_messages = { ‘name’ : { ‘max_length’ : _ ( “this writer name is too long” ) } } |
文章转载来自:trustauth.cn