Django是一个基于python的web框架,这里简单的介绍一下django的表单处理。当然,也会介绍下django的简单的入门。总之,看这篇不需要任何的入门知识,零起步即可。
假设已经安装好了django,这里用的是django 1.5.4 Final。关于如何查看系统中安装的django的版本,可以用下面的方法:
python >>> import django >>> print "版本:",django.VERSION 版本: (1, 5, 4, 'final', 0) >>> print "版本:",django.get_version() 版本: 1.5.4
1、Environment Test
新建一个目录,来存放我们的django工程。这里用的是用户目录下的一个名为pre的目录。利用django自带的“django-admin startproject mysite”命令可以在该目录中新建一个名为“mysite”的django工程(可以看到该目录中多了一个名为mysite的子目录)。可以用tree命令来查看一下该目录的结构,如下:. └── mysite ├── manage.py └── mysite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 2 directories, 5 files这时可以通过python manage.py runserver,来利用django自带的web服务器来运行该工程:
$ python manage.py runserver Validating models... 0 errors found October 16, 2013 - 23:17:22 Django version 1.5.4, using settings 'mysite.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.在浏览器地址栏输入“http://127.0.0.1:8000/”,就可以看到一个“It worked!”的欢迎页面。
2、Developing Test
2.1 View Test
在前面django-admin startproject命令生成的mysite目录(实际上,是mysite/mysite目录。)中,新建一个views.py的文件,并输入以下内容:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")2.2 URLconf Test
然后,找到mysite/mysite目录中的urls.py文件,在其中添加一条关于url的信息,如下(#结尾的行是需要新加的,已经删掉注释):
from django.conf.urls import patterns, include, url from mysite.views import hello # urlpatterns = patterns('', ('^hello/',hello),# )上面2.1写了一个视图函数,2.2配置了url。这样简单地说,对应于该url的http请求,都会由上面的视图函数处理。至于这期间的细节,都是由django这个框架来处理的。这就是用django进行web开发的方便之处。
下面用python manage.py runserver来运行服务器,然后在浏览器地址栏打入“127.0.0.1:8000/hello”,就可以看到效果。
3、表单处理
3.1 HttpRequest
每一个view函数的第一个对象都是一个HttpRequest对象。当用户通过浏览器请求一个页面时,django把关于该请求的所有的metadata(实际上,HttpRequest对象代表一个来自user-agent的http请求,大多数重要的请求信息都会作为HttpRequest对象的属性出现。)封装成一个HttpRequest对象。然后,将该对象传递给相应的view函数,view函数处理该请求并返回一个HttpResponse对象。
下面的图片说明了HttpRequest对象的一些常用的属性和方法,图片截取自链接。
HttpRequest对象通过request.GET和request.POST两个属性来包含用户所提交的信息,二者都是类字典对象,可以通过它们来访问POST和GET数据。关于二者区别:POST数据是来自HTML中的<form>标签提交的,而GET数据则可能来自<form>提交也可能是url中的查询字符串。
3.2 简单的表单处理
表单的开发通常分为两个部分,前端HTML页面用户接口和后台view函数对所提交数据的处理过程。首先,我们在上面的views.py文件中加入一个显示搜索表单的函数,这时候views.py的内容如下:
from django.http import HttpResponse from django.shortcuts import render_to_response# def hello(request): return HttpResponse("Hello world") def search_form(request):# return render_to_response("search_form.html")#然后,我们在mysite(urls.py的上级目录)目录中新建一个templates目录,用来存放模版。并在其中写一个search_form.html的模版,内容如下:
<html> <head> <title>Search</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>配置urls.py,如下:
from django.conf.urls import patterns, include, url from mysite.views import hello from mysite.views import search_form# urlpatterns = patterns('', ('^hello/',hello), (r'^search-form/$',search_form),# )
最后,还需要将上面新建的用来存放模版的目录的绝对路径添加到settings.py中的TEMPLATE_DIRS中。
(1)在views.py中添加相应的view函数
这里可以看出,模版中的表单的name(q)实际上会对应这里view函数中从GET中得到的字段名称。
from django.http import HttpResponse from django.shortcuts import render_to_response def hello(request): return HttpResponse("Hello world") def search_form(request): return render_to_response("search_form.html") def search(request):# if "q" in request.GET:# message="You have searched for:%r" % request.GET["q"]# else:# message="You have submitted an empty form."# return HttpResponse(message)#
(2)配置url
from django.conf.urls import patterns, include, url from mysite.views import hello from mysite.views import search_form from mysite.views import search# urlpatterns = patterns('', ('^hello/',hello), (r'^search-form/$',search_form), (r'^search/$',search),# )这样,点击按钮,就可以看到效果。
下面我们为这个表单加入简单的验证,使其在没有输入任何内容时给出相应的提示。让用户再输入。只两步:
(1)在views.py中修改相应的view函数
from django.http import HttpResponse from django.shortcuts import render_to_response def hello(request): return HttpResponse("Hello world") def search_form(request): return render_to_response("search_form.html") def search(request):# if "q" in request.GET and request.GET["q"]:# message="You have searched for:%r" % request.GET["q"]# return HttpResponse(message)# else:# message="You have submitted an empty form."# return render_to_response("search_form.html",{"error":True})#
(2)修改模版文件search_form.html
<html> <head> <title>Search</title> </head> <body> {% if error %} <p style="color: red;">Please submit a search term, instead of empty.</p> {% endif %} <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>这样,便可以看到效果了。
下面我们精简一下这个程序,将显示表单和表单的处理用一个url来解决。
(1)修改url配置,将现实视图的url去掉
from django.conf.urls import patterns, include, url from mysite.views import hello #from mysite.views import search_form from mysite.views import search# urlpatterns = patterns('', ('^hello/',hello), #(r'^search-form/$',search_form),# (r'^search/$',search),# )(2)修改views.py函数,去掉现实表单的视图,并修改处理表单的view函数(增加无表单提交的处理)
from django.http import HttpResponse from django.shortcuts import render_to_response def hello(request): return HttpResponse("Hello world") #def search_form(request): # return render_to_response("search_form.html") def search(request): error=False# if "q" in request.GET:# keyword=request.GET["q"]# if not keyword:# error=True# else:# message="You have searched for:%r" % keyword# return HttpResponse(message)# return render_to_response("search_form.html",{"error":error})#现在可以,看出效果相同,但是,很明显,这样更加简洁合理。(另外,其实在模版的表单定义中,由于表单交给的还是原来的url)
3.3 利用django自带的表单库处理表单
实际上,上面实现的是最简单的表单处理方法,simple and navie。为了方便处理表单,django带有一个form库(django.forms),这个库可以处理HTML表单显示及验证。表单框架最主要的用法是,为每一个将要处理的HTML的<Form>定义一个Form类。在这个例子中,我们只有一个<Form>,因此我们只需定义一个Form类。>这个类可以存在于任何地方,甚至直接写在views.py文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。在存放views.py的目录中>,创建这个文件,然后输入关于表单的定义即可。下面我们将上面的例子改成用django.forms实现。
(1)定义form类
在views.py所在的目录中,新建一个forms.py,并输入:
from django import forms class SearchForm(forms.Form): keyword = forms.CharField()
(2)用上面定义的form改写view函数
from django.http import HttpResponse from django.shortcuts import render_to_response from mysite.forms import SearchForm# def hello(request): return HttpResponse("Hello world") def search(request): if request.method=="GET": form=SearchForm(request.GET) if form.is_valid(): cd = form.cleaned_data if cd["keyword"]: message = 'You searched for: %r' % cd["keyword"] return HttpResponse(message) else: form=SearchForm() return render_to_response('search_form.html', {'form':form})(3)用上面定义的form改写模版(templates目录中的search_form.html)
<html> <head> <title>Search</title> </head> <body> {% if form.errors %} <p style="color: red;">Please submit a search term.</p> {% endif %} <form action="/search/" method="get"> <p> {{ form.as_p}} </p> <input type="submit" value="Search"> </form> </body> </html>这样,便可以实现和上面大致相同的效果。但是很明显,用django.forms的实现,更加简洁方便。
