django.forms 是Django处理form的库

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

django.forms 是Django处理form的库 本质上可以直接通过对HttPRequest达到同样的效果,但是django.from带来更便捷的处理方式。功能有几点

通过form类的定义自动生成html自己validate提交的数据重新呈现form表单将form的数据转换成python的数据类型整体介绍Form对象 Form对象,继承django.forms.Form类继承form的field.以及检验的规则。form field有多种类型,可以通过此链接查看:Form fields

如果你的模型是直接和model对应。则使用 ModelForm 避免重复描述

使用Form初步举例:

from django.shortcuts import renderfrom django.http import HttpResponseRedirect

def contact(request):

if request.method == 'POST': # form的提交方式

form = ContactForm(request.POST) # 构建form

if form.is_valid(): # 通过form定义的规则检查是否正确

# 如果form的data进行操作

# ...

return HttpResponseRedirect('/thanks/') # Redirect after POST

else:

form = ContactForm() # 空的form

return render(request, 'contact.html', {

'form': form,#渲染

})

处理form中的上传文件查看链接Binding uploaded files to a form.

处理form中的数据如果form.is_valid()为True,我们可以通过form.cleaned_data 这个dict来获取数据自动转型且较为方便

在template中使用form<form action="/contact/" method="post">{%csrf_token%}{{ form.as_p }}<input type="submit" value="Submit" /></form>

如果需要使用上传在form中加入enctype="multipart/form-data"这个属性

form.as_p 可以将每个form的组件输出来html中。当然也有form.as_table和form.as_ul不过,两边的包裹元素要自己添加。如<table>和<ul>标签

当然可以自定义输出的form,这里有个例子:

<form action="/contact/" method="post">

{{ form.non_field_errors }}

<div class="fieldWrapper">

{{ form.subject.errors }}

<label for="id_subject">Email subject:</label>

{{ form.subject }}

</div>

<div class="fieldWrapper">

{{ form.message.errors }}

<label for="id_message">Your message:</label>

{{ form.message }}

</div>

<div class="fieldWrapper">

{{ form.sender.errors }}

<label for="id_sender">Your email address:</label>

{{ form.sender }}

</div>

<div class="fieldWrapper">

{{ form.cc_myself.errors }}

<label for="id_cc_myself">CC yourself?</label>

{{ form.cc_myself }}

</div>

<p><input type="submit" value="Send message" /></p></form>

使用循环输出form例子:

<form action="/contact/" method="post">

{# Include the hidden fields #}

{% for hidden in form.hidden_fields %}

{{ hidden }}

{% endfor %}

{# Include the visible fields #}

{% for field in form.visible_fields %}

<div class="fieldWrapper">

{{ field.errors }}

{{ field.label_tag }} {{ field }}

</div>

{% endfor %}

<p><input type="submit" value="Send message" /></p></form>

Form部分ApiForm class

api

类型

作用

备注

is_bound

属性Boolean

检查当前form是否已经绑定数据

is_valid()

方法Boolean

执行校验器,检查form中的数据是否符合定义规则

errors

属性dict

存放错误信息

当form绑定数据以后,调用is_valid或者errors都回导致validate的执行。而且只会执行一次。不管以后调用多少次

initial

属性

给form中的字段初始化

在初始化的调用方式f=ContactForm(initial={'subject':'Hi there!'}),当然也可以在field中指定

forms.CharField(initial='class')。两者的优先级是:后者生效

fields

属性

获取form的字段信息

另外拥有base_fields 这个属性,是整个Python进程的所有form的 instance共享的,如果更改其中内容。所有同一form的instantce都会

cleaned_data

属性

获取form中的安全数据

即使form出错。也可以获取其中正确的内容。而且同时包括Optional的字段

as_table() default、as_ul()、as_p()

方法

获取form生成的html

required_CSS_class、error_css_class

属性

设定默认的css和错误的css

eg.<tr class="required"><th><label for="id_subject">Subject:</label> ...<tr class="required"><th><label for="id_message">Message:</label> ...<tr class="required error"><th><label for="id_sender">Sender:</label> ...<tr><th><label for="id_cc_myself">Cc myself:<label> ...

auto_id

属性

设置html的生成id方式

三种值:False:不生成label标签和input的id值

True:生成label标签而且直接使用field的name作为id值

"xxx_%s":生成label标签。而且id的前缀为xxx_ 。。

ps:如果第三不加入%s。则当成True来处理。默认的处理方式是"id_%s"

label_suffix

属性

在label的值后面出现的字符串

默认为: 自己设置—>等符号

is_multipart

方法

检测这个form是否需要multipart

检查是否添加enctype="multipart/form-data"

prefix

属性

一般用于同一Form区别namespace用

bound field class

api

类型

作用

备注

errors

属性list

获取当前绑定字段的错误

label_tag(contents=None, attrs=None, label_suffix=None)

方法Str

获取当前字段的生成的label_tag

css_classes()

方法Str

获取或者设置当前字段的渲染的css

参数带值就是设置。没就是设置

values()

方法

获取当前字段的值

id_for_label

字段的id

只读当前label的id

设置使用my_field=forms.CharField(widget=forms.TextInput(attrs={'id':'myFIELD'}))

field classapi

类型

作用

备注

clean(value)

方法

执行validate,如果成功输出clean 的Str,如果失败抛出Error

required

属性

如果设置为True,则需要设置此值

label

属性

设置输出的html中label标签里面的值

inital

属性

初始化值,仅在第一次初始化的时候调用

widget

属性

可以自定义widget

help_text

属性

在渲染的时候会放在渲染字段的后面

error_messages

属性

传入一个dict重写错误的消息

eg. name=forms.CharField(error_messages={'required':'Please enter your name'})

validators

属性

设置当前字段的校验器

localize

属性

或者本地化字段

上传文件将form类型设置为enctype="multipart/form-data"使用request.FILES来初始化即可 f = ContactFormWithMugshot(request.POST, request.FILES) 字段

根据model生成Form可以通过model并指定字段直接生成form,避免重复声明

eg.

classArticleForm(ModelForm):...classMeta:...model=Article...fields=['pub_date','headline','content','reporter']

对应表:

Model fieldForm fieldAutoField

Not represented in the form

BigIntegerField

IntegerField with min_value set to -9223372036854775808 andmax_value set to 9223372036854775807.

BooleanField

BooleanField

CharField

CharField with max_length set to the model field’s max_length

CommaSeparatedIntegerField

CharField

DateField

DateField

DateTimeField

DateTimeField

DecimalField

DecimalField

EmailField

EmailField

FileField

FileField

FilePathField

FilePathField

FloatField

FloatField

ForeignKey

ModelChoiceField (see below)

ImageField

ImageField

IntegerField

IntegerField

IPAddressField

IPAddressField

GenericIPAddressField

GenericIPAddressField

ManyToManyField

ModelMultipleChoiceField (see below)

NullBooleanField

CharField

PositiveIntegerField

IntegerField

PositiveSmallIntegerField

IntegerField

SlugField

SlugField

SmallIntegerField

IntegerField

TextField

CharField with widget=forms.Textarea

TimeField

TimeField

URLField

URLField

PS:

If the model field has blank=True, then required is set to False on the form field. Otherwise, required=True.使用方法:

modelForm save方法:可以直接保存到database如果出错也会抛出Error ,如果save(commit=False),则只会创建对象不会提交,可以继续修改

modelForm,中如果要指定相应field的属性可以通过meta指定

eg.

classMeta:model=Authorfields=('name','title','birth_date')labels={'name':_('Writer'),}help_texts={'name':_('Some useful help text.'),}error_messages={'name':{'max_length':_("This writer's name is too long."),},}

也可以通过字段设置,eg.

classArticleForm(ModelForm):headline=MyFormField(max_length=200,required=False,help_text="Use puns liberally")classMeta:model=Articlefields=['headline','content']

modelform_factory可以在运行时动态使用factory生成modelform 不需要事先声明。 eg.BookForm=modelform_factory(Book,fields=("author","title"))

Formset可以生产同一个form的set,并获取值 使用方式:

defmanage_authors(request):AuthorFormSet=modelformset_factory(Author)ifrequest.method=='POST':formset=AuthorFormSet(request.POST,request.FILES)ifformset.is_valid():formset.save()# do something.else:formset=AuthorFormSet()returnrender_to_response("manage_authors.html",{"formset":formset,})

Form assert可以设定form需要的资源eg.

classCalendarWidget(forms.TextInput):

classMedia:

css={'all':('pretty.css',)}js=('animations.js','actions.js')

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航