当前位置: 代码迷 >> Web前端 >> Django表单处置
  详细解决方案

Django表单处置

热度:217   发布时间:2013-10-19 20:58:23.0
Django表单处理

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中。

这样,启动服务器,在浏览器地址栏输入http://127.0.0.1:8000/search-form/,便可以看到该表单的效果了(只有一个输入框和一个“Search”按钮)。但是,现在点击按钮,是没有反应的,因为这个表单提交之后会发送一个http请求(url为“/search”),但是我们还没有处理这个url,下面我们对该请求进行响应。主要是下面几个步骤:

(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的实现,更加简洁方便。微笑