django.forms 是Django处理form的库

     本质上可以直接通过对HttpRequest达到同样的效果,但是django.from带来更便捷的处理方式。功能有几点
  1. 通过form类的定义自动生成html
  2. 自己validate提交的数据
  3. 重新呈现form表单
  4. 将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中的上传文件

  • 处理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和错误的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=Noneattrs=Nonelabel_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 属性 或者本地化字段  

上传文件

  1. 将form类型设置为enctype="multipart/form-data"
  2. 使用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 field Form field
AutoField 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.

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')
 

Django Form的学习的更多相关文章

  1. django form使用学习记录

    Django forms使用容易, 又方便扩展, 因此Django admin和CBVs基本都基于forms使用. 事实上, 由于django forms的强大验证功能, 大多数Django API ...

  2. Django学习笔记之Django Form表单详解

    知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...

  3. Django学习笔记之Django Form表单

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

  4. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  5. django: form fileupload - 1

    本节介绍 Form 中一些字段类型的使用,以文件上传字段 FileField 为例:(注,其它字段和相关用法见官方文档中的 Forms -> Built-in Fields) 一,配置 urls ...

  6. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  7. Django form模块使用心得

    最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...

  8. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

  9. Django form表单

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

随机推荐

  1. web前端开发(3)

    css 类命名使用骆驼命名法,可以与划线法结合使用. 骆驼命名法用于区别单词,划线命名用于表达从属关系. 尽量不要使用子选择器,否则容易引起冲突隐患. css可以分为 base.common.page ...

  2. css+div网页设计(三)--与多种技术的混合应用

    本篇博客将介绍css与多种技术的混合应用,javascript可以为我们的页面更加方便的交互,xml使数据存储跟方便,ajax的异步更新可以加快我们网页的载入速度. 1.css与javascript ...

  3. Javascript函数(定义、传值、重载)

    Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1() ...

  4. python备忘录

    本文主要是记录一下python,比较详尽的python学习资料: Python学习笔记_王纯业 http://pan.baidu.com/s/1eQrDEYA 部分有详细的博文链接 1.字符串: 切片 ...

  5. AJAX一些基本知识点

    ajax的定义: 中文意思:异步JavaScript和XML. 指一种创建交互式网页应用的网页开发技术. ajax的核心是XMLHttpRequest,在页面中由XMLHTTPRequest来发出Ht ...

  6. Part 14 ng hide and ng show in AngularJS

    ng-hide and ng-show directives are used to control the visibility of the HTML elements. Let us under ...

  7. Javascript之动画1

    我们来做一个小球运动的例子:在这个demo中,我们要求连续多次点击小球“开始”按钮,小球运动速度就越来越快.但是还是不完美存在BUG的,经过多次点击“开始”按钮再点击"停止"按钮就 ...

  8. Android之开源项目优秀项目篇

    本文转自:http://www.trinea.cn/android/android-open-source-projects-excellent-project/ 记录的项目主要依据是项目有意思或项目 ...

  9. 表情键盘及文字表情识别简单demo

    1.前言 了解了简单图文混排 (属性字符串的使用)及 正则表达式的部分知识,为了加深印象,写了个简单表情键盘demo 展示文字用的是 UITextView 由于时间匆忙,存在一些bug,以及不完善的地 ...

  10. mfc110ud.dll not found

    mfc110ud.dll not found while debugging vs2012 MFC application. Possible Solutions: 1) >>>&g ...