【Python】django表单与提交
2015-11-25 14:05
507 查看
参考:http://djangobook.py3k.cn/2.0/chapter07/
本文的内容应属于django的表单模块,没有涉及到的后端request对象的处理方法可以单独深入学习表单。
[b]URL和View[/b]
写一个简单的views.py:
每个视图函数至少要有一个参数,通常被叫作request。 这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个示例中,我们虽然不用request做任何事情,然而它仍必须是这个视图的第一个参数。
这个函数只有简单的一行代码: 它仅仅返回一个HttpResponse对象,这个对象包含了文本“Hello world”。
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。
在urls.py添加hello:
首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 hello 视图。 (这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。)
接下来,我们为urlpatterns加上一行: (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。
正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response,例如,网页内容。
请求在django中view.py和urls.py的简单调用流程说明:
1、进来的请求转入/hello/.
2、Django通过在ROOT_URLCONF配置来决定根URLconf.
3、Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
4、如果找到匹配,将调用相应的视图函数
5、视图函数返回一个HttpResponse
6、Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
Request对象
HttpRequest对象包含当前请求URL的一些信息:
request.path: 除域名以外的请求路径,以正斜杠开头,例如"/hello/"
request.get_host(): 主机名(比如,通常所说的域名),例如"127.0.0.1:8000" or "www.example.com"
request.get_full_path(): 请求路径,可能包含查询字符串,例如"/hello/?print=true"
request.is_secure(): 如果通过HTTPS访问,则此方法返回True,否则返回False/True,或者False
request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。
request.META 字典中几个常见的键值有:
HTTP_REFERER: 进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
HTTP_USER_AGENT:用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
REMOTE_ADDR:客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)
例如:
或者:
注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。你应该用try/except语句,或者用Python字典的get()方法来处理这些“可能不存在的键”:
[b]GET和POST[/b]
除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息:request.GET 和 request.POST。二者都是类字典对象,你可以通过它们来访问GET和POST数据。
POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。
“request.GET和request.POST是类字典对象”,意思是他们的行为像Python里标准的字典对象,但在技术底层上他们不是标准字典对象。 比如说,request.GET和request.POST都有get()、keys()和values()方法,你可以用用 for key in request.GET 获取所有的键。
request.GET和request.POST拥有一些普通的字典对象所没有的方法。
类文件对象:这些Python对象有一些基本的方法,如read(),用来做真正的Python文件对象的代用品。
制作一个登录页面:
home_bak.html:
view.py
试用把request.GET获取到的内容打印出来,可以看出是一个字典类型:
request.GET的使用说明:
1、request.GET是由前端method="get"传进来的内容(字典)
2、html中的表单action="/t/"是动作后的指向,也就是view.py中的函数t,注意方法method="get"
3、name="user"和name="passwd"是两个html变量,当提交表单时,变量的值通过GET(method=”get”)附加在URL /t/上
4、在视图的函数t中处理通过request.GET来获取的值
注意:就像上面request.META小节里面提到,对于用户提交过来的数据,甚至是正确的数据,都需要进行过滤。在这里若没有进行检测,那么用户提交一个空的表单将引发KeyError异常。request.GET.get()可以设置一个默认值,较request.GET可以解决没有对应Key的问题。
获取使用POST方法的数据与GET的相似,只是使用request.POST代替了request.GET,用法一样,在Django 1.8中的setting.py中注释'django.middleware.csrf.CsrfViewMiddleware',否则使用request.POST会报错,两者相比较POST方式比GET方式更安全。 (如果你有兴趣了解更多关于GET和POST的知识,可以参见http://www.w3.org/2001/tag/doc/whenToUseGet.html。)
[b]form类[/b]
Django带有一个form库,称为django.forms,这个库可以处理我们本章所提到的包括HTML表单显示以及验证,但是通常情况下不使用这种方法进行权限方面的验证,对于验证的实现可以看另一个分享,这个表单的form类大家简单了解即可。
表单框架最主要的用法是为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。
在上面例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个forms.py,在存放views.py 的目录中,创建这个文件,然后输入:
表单中的每一个字段(域)作为Form类的属性,被展现成Field类。这里只用到CharField和EmailField类型。 每一个字段默认都是必填。要使字段类型改为可选项,我们需要指定required=False。
可以在项目路径使用python manager.py shell命令行查看Python解释器这个类做了什么:
也可以使用自带的方法和属性:
调用任何绑定form的is_valid()方法,就可以知道它的数据是否合法:
每一个邦定Form实例都有一个errors属性,它为你提供了一个字段与错误消息相映射的字典表:
如果一个Form实例的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。 Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数据:
表单的属性也可以添加字段最大/最小长度、初始值和字段展示:
本文的内容应属于django的表单模块,没有涉及到的后端request对象的处理方法可以单独深入学习表单。
[b]URL和View[/b]
写一个简单的views.py:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
每个视图函数至少要有一个参数,通常被叫作request。 这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个示例中,我们虽然不用request做任何事情,然而它仍必须是这个视图的第一个参数。
这个函数只有简单的一行代码: 它仅仅返回一个HttpResponse对象,这个对象包含了文本“Hello world”。
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。
在urls.py添加hello:
from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )
首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 hello 视图。 (这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。)
接下来,我们为urlpatterns加上一行: (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。
正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response,例如,网页内容。
请求在django中view.py和urls.py的简单调用流程说明:
1、进来的请求转入/hello/.
2、Django通过在ROOT_URLCONF配置来决定根URLconf.
3、Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
4、如果找到匹配,将调用相应的视图函数
5、视图函数返回一个HttpResponse
6、Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
Request对象
HttpRequest对象包含当前请求URL的一些信息:
request.path: 除域名以外的请求路径,以正斜杠开头,例如"/hello/"
request.get_host(): 主机名(比如,通常所说的域名),例如"127.0.0.1:8000" or "www.example.com"
request.get_full_path(): 请求路径,可能包含查询字符串,例如"/hello/?print=true"
request.is_secure(): 如果通过HTTPS访问,则此方法返回True,否则返回False/True,或者False
request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。
request.META 字典中几个常见的键值有:
HTTP_REFERER: 进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
HTTP_USER_AGENT:用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
REMOTE_ADDR:客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)
例如:
from django.shortcuts import render_to_response def test(request): info = request.META['HTTP_USER_AGENT'] return render_to_response('test.html',{'info':info})
或者:
from django.http import HttpResponse,HttpResponseRedirect def test(request): info = request.META['HTTP_USER_AGENT'] return HttpResponse("%s" % info)
注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。你应该用try/except语句,或者用Python字典的get()方法来处理这些“可能不存在的键”:
# BAD! def ua_display_bad(request): ua = request.META['HTTP_USER_AGENT'] # Might raise KeyError! return HttpResponse("Your browser is %s" % ua) # GOOD (VERSION 1) def ua_display_good1(request): try: ua = request.META['HTTP_USER_AGENT'] except KeyError: ua = 'unknown' return HttpResponse("Your browser is %s" % ua) # GOOD (VERSION 2) def ua_display_good2(request): ua = request.META.get('HTTP_USER_AGENT', 'unknown') return HttpResponse("Your browser is %s" % ua)
[b]GET和POST[/b]
除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息:request.GET 和 request.POST。二者都是类字典对象,你可以通过它们来访问GET和POST数据。
POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。
“request.GET和request.POST是类字典对象”,意思是他们的行为像Python里标准的字典对象,但在技术底层上他们不是标准字典对象。 比如说,request.GET和request.POST都有get()、keys()和values()方法,你可以用用 for key in request.GET 获取所有的键。
request.GET和request.POST拥有一些普通的字典对象所没有的方法。
类文件对象:这些Python对象有一些基本的方法,如read(),用来做真正的Python文件对象的代用品。
制作一个登录页面:
home_bak.html:
<html> <head> <title>Home</title> </head> <body> <form action="/t/" method="get"> <div id="base" class=""> <!-- Unnamed (文本框(单行)) --> <div id="u0" class="ax_文本框_单行_"> <input id="u0_input" type="text" value="user" name="user"/> </div> <!-- Unnamed (文本框(单行)) --> <div id="u1" class="ax_文本框_单行_"> <input id="u2_input" type="text" value="password" name="passwd"/> <!-- Unnamed (HTML按钮) --> <div id="u2" class="ax_html__"> <input id="u1_input" type="submit" value="提交"/> </div> </form> </div> </body> </html>
view.py
from django.http import HttpResponse,HttpResponseRedirect from django.shortcuts import render_to_response def login(request): return render_to_response('home_bak.html') def t(request): User,passwd=request.GET.get('user',""),request.GET.get('passwd',"") 9 return HttpResponse("User is %s,Password is %s" % (User,passwd))
试用把request.GET获取到的内容打印出来,可以看出是一个字典类型:
<QueryDict: {u'passwd': [u'testpasswd'], u'user': [u'testuser']}>
request.GET的使用说明:
1、request.GET是由前端method="get"传进来的内容(字典)
2、html中的表单action="/t/"是动作后的指向,也就是view.py中的函数t,注意方法method="get"
3、name="user"和name="passwd"是两个html变量,当提交表单时,变量的值通过GET(method=”get”)附加在URL /t/上
4、在视图的函数t中处理通过request.GET来获取的值
注意:就像上面request.META小节里面提到,对于用户提交过来的数据,甚至是正确的数据,都需要进行过滤。在这里若没有进行检测,那么用户提交一个空的表单将引发KeyError异常。request.GET.get()可以设置一个默认值,较request.GET可以解决没有对应Key的问题。
获取使用POST方法的数据与GET的相似,只是使用request.POST代替了request.GET,用法一样,在Django 1.8中的setting.py中注释'django.middleware.csrf.CsrfViewMiddleware',否则使用request.POST会报错,两者相比较POST方式比GET方式更安全。 (如果你有兴趣了解更多关于GET和POST的知识,可以参见http://www.w3.org/2001/tag/doc/whenToUseGet.html。)
[b]form类[/b]
Django带有一个form库,称为django.forms,这个库可以处理我们本章所提到的包括HTML表单显示以及验证,但是通常情况下不使用这种方法进行权限方面的验证,对于验证的实现可以看另一个分享,这个表单的form类大家简单了解即可。
表单框架最主要的用法是为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。
在上面例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个forms.py,在存放views.py 的目录中,创建这个文件,然后输入:
from django import forms class loginForm(forms.Form): user = forms.CharField() passwd = forms.CharField() email = forms.EmailField(required=False)
表单中的每一个字段(域)作为Form类的属性,被展现成Field类。这里只用到CharField和EmailField类型。 每一个字段默认都是必填。要使字段类型改为可选项,我们需要指定required=False。
可以在项目路径使用python manager.py shell命令行查看Python解释器这个类做了什么:
>>> from test1.form import loginForm >>> f=loginForm() >>> print f <tr><th><label for="id_user">User:</label></th><td><input id="id_user" name="user" type="text" /></td></tr> <tr><th><label for="id_passwd">Passwd:</label></th><td><input id="id_passwd" name="passwd" type="text" /></td></tr> <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" /></td></tr>
也可以使用自带的方法和属性:
>>> f.as_ul() u'<li><label for="id_user">User:</label> <input id="id_user" name="user" type="text" /></li>\n<li><label for="id_passwd">Passwd:</label> <input id="id_passwd" name="passwd" type="text" /></li>\n<li><label for="id_email">Email:</label> <input id="id_email" name="email" type="email" /></li>' >>> f.as_p() u'<p><label for="id_user">User:</label> <input id="id_user" name="user" type="text" /></p>\n<p><label for="id_passwd">Passwd:</label> <input id="id_passwd" name="passwd" type="text" /></p>\n<p><label for="id_email">Email:</label> <input id="id_email" name="email" type="email" /></p>'
调用任何绑定form的is_valid()方法,就可以知道它的数据是否合法:
>>> f = loginForm({'user': 'test', 'passwd': '', 'email': ''}) >>> f.is_valid() False >>> f = loginForm({'user': 'test', 'passwd': 'passwd', 'email': ''}) >>> f.is_valid() True
每一个邦定Form实例都有一个errors属性,它为你提供了一个字段与错误消息相映射的字典表:
>>> f = loginForm({'user': 'test', 'passwd': '', 'email': ''}) >>> f.errors {'passwd': [u'This field is required.']}
如果一个Form实例的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。 Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数据:
>>> f.cleaned_data {'passwd': u'passwd', 'user': u'test', 'email': u''}
表单的属性也可以添加字段最大/最小长度、初始值和字段展示:
from django import forms class loginForm(forms.Form): user = forms.CharField(max_length=3) passwd = forms.CharField(widget=forms.Textarea) email = forms.EmailField(required=False) >>> from test1.form import loginForm >>> f = loginForm({'user': 'test', 'passwd': 'passwd', 'email': ''}) >>> f.errors {'user': [u'Ensure this value has at most 3 characters (it has 4).']}
相关文章推荐
- python 看到的用法的记录
- python进行crc校验的方法小感
- Python数据分析扩展库
- python20151125
- 每天一点python——xlrd
- Python面向对象关系
- 实现MySQL回滚的Python脚本的编写教程
- pickle 在python 2和python 3中兼容性问题
- 多线程学习——python脚本批量修改华为交换机端口配置
- python绘图工具reportlab介绍----续
- python基础知识小结之集合
- Python - 操作Excel(中)
- Beginning Python Chapter1
- python 多线程实现检测服务器在线情况
- python 查看API
- python的文件句柄一次只能用一次
- python 采集MySQL数据,并更新到另外一个库
- Python 批量下载文件
- 如何利用cURL和python对服务端和web端进行接口测试
- Python Django chartit 多报表显示