首页域名资讯 正文

Django ModelForm与Form

2024-10-01 1 0条评论

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 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类就行了

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

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

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

内建的weidget

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

ModelForm表单

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表单是可以接受对象的数据

save()方法

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

save(commit=False)

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_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 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

文章版权及转载声明

本文作者:亿网 网址:https://edns.com/ask/post/163266.html 发布于 2024-10-01
文章转载或复制请以超链接形式并注明出处。