Django表单处理
Django是一个基于python的web框架,这里简单的介绍一下django的表单处理。当然,也会介绍下django的简单的入门。总之,看这篇不需要任何的入门知识,零起步即可。假设已经安装好了django,这里用的是django 1.5.4 Final。关于如何查看系统中安装的django的版本,可以用下面的方法:python>>> import django>>> print
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的实现,更加简洁方便。
更多推荐



所有评论(0)