Python的Django框架中forms表单类的使用方法详解2
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解。
Form表单的功能
- 自动生成HTML表单元素
- 检查表单数据的合法性
- 如果验证错误,重新显示表单(数据不会重置)
- 数据类型转换(字符类型的数据转换成相应的Python类型)
Form相关的对象包括
- Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签
- Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
- Form:一系列Field对象的集合,负责验证和显示HTML元素
- Form Media:用来渲染表单的CSS和JavaScript资源。
Form Objects
Form对象封装了一系列Field和验证规则,Form类都必须直接或间接继承自django.forms.Form,定义Form有两种方式:
方法一:直接继承Form
from django import forms class ContactForm(forms.Form):subject = forms.CharField(max_length=100,label='主题')message = form.CharField(widget=forms.TextArea)sender = form.EmailField()cc_myself = forms.BooleanField(required=False)
方法二:结合Model,继承django.forms.ModelForm
#models.py class Contact(models.Model):title = models.CharField(max_length=30)content = models.CharField(max_length=20)#form.py class ConotactForm(ModelForm):class Meta:model = Contactfield = ('title','content') #只显示model中指定的字段
在视图(view)中使用form
在view函数中使用form的一般情景是:
view.py:
form django.shortcuts import render form django.http import HttpResponseRedirectdef contact(request):if request.method=="POST":form = ContactForm(request.POST)if form.is_valid(): #所有验证都通过#do something处理业务return HttpResponseRedirect('/')else:form = ContactForm()return render(request,'contact.html',{'form':form})
contact.html:
<form action='/contact/' method='POST'>{% for field in form %}<div class = 'fieldWrapper'>{{field.label_tag}}:{{field}}{{field.errors}}</div>{% endfor %}<div class='fieldWrapper'> <p><input type='submit' value='留言'></p></div> </form>
处理表单数据
form.is_valid()返回true后,表单数据都被存储在form.cleaned_data对象中(字典类型,意为经过清洗的数据),而且数据会被自动转换为Python对象,如:在form中定义了DateTimeField,那么该字段将被转换为datetime类型,还有诸如:IntegerField、FloatField
if form.is_valid():subject = form.cleaned_data['subject']message = form.cleaned_data['message']sender = form.cleaned_data['sender']cc_myself = form.cleaned_data['cc_myself']recipients = ['info@example.com']if cc_myself:recipients.append(sender)from django.core.mail import send_mailsend_mail(subject, message, sender, recipients)return HttpResponseRedirect('/thanks/') # Redirect after POST
Form的简单使用方法就这些。 另:
在模版中显示表单的几种方式:
显示form找template中的方法多种多样,也可以自定义:
<form action="/contact/" method="post">{% csrf_token %} {{ form.as_p }} <input type="submit" value="Submit" /> </form>
还可以使用form.as_table、form.as_ul,分别表示用<p>标签,<table>标签和<ul>表示显示表单。如果要自定义,你只要获取到每个元素的值就行:
<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.name_of_field}}得到。
也可以通过迭代form,每个迭代元素对应的是form里面的field
<form action="/contact/" method="post">{% for field in form %}<div class="fieldWrapper">{{ field.errors }}{{ field.label_tag }}: {{ field }}</div>{% endfor %}<p><input type="submit" value="Send message" /></p> </form>
{{field}}有如下属性:
{{field.lable}},如:Email address {{field.label_tag}},如: <label for=id_email>Email address</label> {{field.value}} 如:someone.@gmail.com {{field.errors}}
实例:构建表单
第一步:首先在models.py中定义一个表单模型
class RemarkForm(forms.Form):subject = forms.CharField(max_length=100 ,label='留言标题')mail = forms.EmailField(label='电子邮件')topic = forms.ChoiceField(choices=TOPIC_CHOICES,label='选择评分') message = forms.CharField(label='留言内容',widget=forms.Textarea)cc_myself = forms.BooleanField(required=False ,label='订阅该贴')
那个topic中的choices需要在models.py中定义一个数组.
TOPIC_CHOICES = (('leve1', '差评'),('leve2', '中评'),('leve3', '好评'), )
这样,之后在html显示的表单就采用这个模型的数据了。
另外还有一种定义表单模型的方式,那就是直接继承另一个models。如果我们在models里设计数据库时,已经设计好了一个类(就是数据库的表)之后想复用这个类的信息来作为表单的模型,那么很简单,同样是在models中的一个类
class Advertisement(models.Model): #订单编号OrderID = models.ForeignKey(OrderInfo)#//广告标题#Title = models.CharField(max_length = 36) #//广告内容#Content = models.CharField(max_length = 600)
注意,他的类型是models.Model,是做数据库ORM用的。
然后怎么关联呢?
需要导入一个新的类 (ModelForm)
from django.forms import ModelFormclass ContactForm(ModelForm):class Meta:model = Advertisementfields = ('Title', 'CustomerID')
这里的Advertisement就是之前那个ORM的模型。
第二步:OK,继续我们的表单,下一步需要做什么呢?开始在views.py里写对表单的调用吧.
def remark(request):
if request.method == 'POST': # 如果表单被提交form = ContactForm(request.POST) # 获取Post表单数据if form.is_valid(): # 验证表单return HttpResponseRedirect('/') # 跳转 else:form = ContactForm() #获得表单对象return render_to_response('message.html', {'form': form, })
整个代码很简单,我就不过多的解释了。
第三步:我们知道django里任何访问都是通过urls.py来管理的。所以下面我们需要配置一个路径。
(r'^message', 'iring.views.remark'),
第四步:最后应该是建立一个模板的时候了,因为我们最终是输出到html上的.注意views的remark函数最后一行
return render_to_response('message.html', {'form': form, })
就是讲当前的表单对象输出到message.html里,自动生成一个表单。
所以,先构建一个html.
这个html模板很简单,除去不必要的CSS,我只给出核心部分好啦。
<form action="/message/" method="POST"> {% for field in form %}<div class="fieldWrapper">{{ field.label_tag }}:{{ field }} {{ field.errors }}div> {% endfor %} <div class="fieldWrapper"><p><input type="submit" value="留言" />p>div> form>
{% for field in form %}{% endfor %}
用于对表单对象里的元素进行遍历,然后通过
{{ field.label_tag }} {{ field }} {{ field.errors }}
这三个标签来输出,注意{{ field.errors }}默认情况下是不会输出的,只有当验证表单正确性时才会输出内容。
文章转自:http://www.jb51.net/article/87046.htm
Python的Django框架中forms表单类的使用方法详解2相关推荐
- Python的Django框架中forms表单类的使用方法详解
Form Form的验证思路 前端:form表单 后台:创建form类,当请求到来时,先匹配,匹配出正确和错误信息. Django的Form验证实例: 创建project,进行基础配置文件配置 set ...
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- mysql 中的neq_mysql中neq使用Python的Django框架中的压缩组件Django Compressor_MySQL
为了加快网站的加载速度,我们通常要多js和css进行压缩处理.这些js和css的压缩工作如果都手动处理,费时费力. <mysql中neq使用Python的Django框架中的压缩组件Django ...
- 掌财社:html5中AmazeUI框架中JS表单验证实战案例展示!
今天和大家分享个有关于"html5中AmazeUI框架中JS表单验证实战案例展示!"这方面的相关内容知识,让大家对于html5中AmazeUI框架也可以有所了解! 1.需求 做一个 ...
- php 表单提交文件大小,PHP如何通过表单直接提交大文件详解
PHP如何通过表单直接提交大文件详解 前言 我想通过表单直接提交大文件,django 那边我就是这么干的.而对于 php 来说,我认为尽管可以设置最大上传的大小,但最大也无法超过内存大小,因为它无法把 ...
- mysql小计_Mysql必读用SQL实现统计报表中的小计与合计的方法详解
<Mysql必读用SQL实现统计报表中的"小计"与"合计"的方法详解>要点: 本文介绍了Mysql必读用SQL实现统计报表中的"小计&qu ...
- new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解
new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解 //获得年月日时分秒 //传入日期// ...
- antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证
一.项目要求 1.要求:点击新增按钮弹出新增页面,在输入名称时进行验证,当输入名称和列表下的名称相同,即后台数据库中存在,此时将会提醒用户,该名称已存在, 2.要求:该名称不存在,则新增成功 二.思路 ...
- python中backward_pytorch的梯度计算以及backward方法详解
基础知识 tensors: tensor在pytorch里面是一个n维数组.我们可以通过指定参数reuqires_grad=True来建立一个反向传播图,从而能够计算梯度.在pytorch中一般叫做d ...
最新文章
- 艾伟_转载:把事件当作对象进行传递
- JAVA中console方法怎么用_Java中Console对象实例代码
- ssm学习的第一个demo---crm(2)
- 【NLP】jieba分词-Python中文分词领域的佼佼者
- [HDOJ5573]Binary Tree(找规律,贪心)
- 通过meta进行重定向
- awk之printf及相关参数详解
- 解决android webkit的css postion:fixed支持问题
- 8-7/8 java/redis 客服端
- aspen plus v11使用教程_Aspen Plus11.0安装教程
- Android系统信息获取 之十三:Linux内核版本信息获取
- 如何打造一款火遍国内外的自走棋手游?我们跟《战歌竞技场》的美术和程序聊了聊
- 程序员女朋友礼物python代码_程序员到底该怎么给女朋友挑礼物
- 依图科技暑期实习生面试经验
- android开发论坛!关于Android开发的面试经验总结,含爱奇艺,小米,腾讯,阿里
- [渝粤教育] 中央财经大学 人力资源管理 参考 资料
- 【自动化】车间自动化十大必备装置!
- QQ第一位产品经理吴宵光:腾讯17年发展史上的14个关键点
- python期末大作业_上海交通大学python期末大作业题目(姚天昉)
- STM32学习总结(一)——时钟RCC