打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Django Form的学习
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部分Api
Form 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和错误的csseg.<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 class
api类型作用备注
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.
class ArticleForm(ModelForm):... class Meta:... model = Article... fields = ['pub_date', 'headline', 'content', 'reporter'] 对应表:Model fieldForm field
AutoFieldNot represented in the form
BigIntegerFieldIntegerField with min_value set to -9223372036854775808 andmax_value set to 9223372036854775807.
BooleanFieldBooleanField
CharFieldCharField with max_length set to the model field’s max_length
CommaSeparatedIntegerFieldCharField
DateFieldDateField
DateTimeFieldDateTimeField
DecimalFieldDecimalField
EmailFieldEmailField
FileFieldFileField
FilePathFieldFilePathField
FloatFieldFloatField
ForeignKeyModelChoiceField (see below)
ImageFieldImageField
IntegerFieldIntegerField
IPAddressFieldIPAddressField
GenericIPAddressFieldGenericIPAddressField
ManyToManyFieldModelMultipleChoiceField (see below)
NullBooleanFieldCharField
PositiveIntegerFieldIntegerField
PositiveSmallIntegerFieldIntegerField
SlugFieldSlugField
SmallIntegerFieldIntegerField
TextFieldCharField with widget=forms.Textarea
TimeFieldTimeField
URLFieldURLField
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.
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's name is too long."), }, }
也可以通过字段设置,eg.class ArticleForm(ModelForm): headline = MyFormField(max_length=200, required=False, help_text="Use puns liberally") class Meta: model = Article fields = ['headline', 'content']
modelform_factory
可以在运行时动态使用factory生成modelform 不需要事先声明。 eg.BookForm = modelform_factory(Book, fields=("author", "title"))
Formset
可以生产同一个form的set,并获取值 使用方式:
def manage_authors(request): AuthorFormSet = modelformset_factory(Author) if request.method == 'POST': formset = AuthorFormSet(request.POST, request.FILES) if formset.is_valid(): formset.save() # do something. else: formset = AuthorFormSet() return render_to_response("manage_authors.html", { "formset": formset, })Form assert
可以设定form需要的资源eg.
class CalendarWidget(forms.TextInput):
class Media: css = { 'all': ('pretty.css',) } js = ('animations.js', 'actions.js')
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Django 2.0 发布,都有哪些新特性要注意?
practical django project 第九章 代码共享应用中的表单处理
Django Model 定义语法
Delphi中DBChart的应用
Django的ManyToManyField(多对多)讲解
Django表单系统初体验
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服