Django 快速实战入门(六):表单模型

作者:Hily 原始链接:http://hily.me/blog/2008/11/learning-django-ch6/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处作者信息版权声明

在与用户的交互过程中,表单发挥了十分重要的作用,多数 Web 应用都带有许多的表单处理。与数据模型类似,如果使用传统的开发方法,那么表单页面的编写和提交结果的验证和处理将成为开发者一大头疼事。

因此,Django 中将表单抽象为模型,集表单生成、内容验证为一体。通过视图控制将表单模型、数据模型结合在一起,就可以很容易地实现表单结构的设计、对用户提交数据的验证和数据的保存入库等操作。

下面我们继续上一节中的示例,为留言板创建一个表单页面。

创建表单模型

要利用 Django 的表单模型来创建一个表单页面,就需要先建立一个表单模型。我们在应用目录 messages/ 目录下新建一个表单模型文件 forms.py,专门用于存放各种表单模型:

from django import forms

class MessageForm(forms.Form):
    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    homepage = forms.URLField(required=False)
    title = forms.CharField(required=True)
    content = forms.CharField(required=True)

forms.CharField、forms.EmailField 同上一节我们使用的字段类型一样,是 Django 内置的表单类型,更多的类型和参数说明请参考官方手册

required=True 表示这个字段是必须填写的,否则表单验证时将会提示错误。

创建留言页的视图控制

在视图控制函数中生成一个表单对象,最后交由模板系统格式化显示,同时显示留言记录。

修改后的 messages/views.py 内容如下:

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response·
from forms import MessageForm
from models import Message

def message(request):
    if request.method == 'POST':
        form = MessageForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            homepage = form.cleaned_data['homepage']
            title = form.cleaned_data['title']
            content = form.cleaned_data['content']
            ip = request.META['REMOTE_ADDR']
            m = Message(name=name,
                        email=email,
                        homepage=homepage,
                        title=title,
                        content=content,
                        ip=ip)
            m.save()
            return HttpResponseRedirect('/message/')
    else:
        form = MessageForm()
    messages = Message.objects.all().order_by('-time')
    return render_to_response('message.html',
                {'form': form, 'messages': messages})

当用户提交留言后,request.method 值为 POST,这时候我们使用 MessageForm(request.POST) 来处理表单内容。

如果验证通过,则 form.is_valid() 为 True,这时我们就把提交的内容添加到数据库中,这些提交的内容经过验证后都保存在 form.cleaned_data 字典中。

最后返回一个 HttpResponseRedirect 对象,作用是重定向到 /message/ 页,防止用户刷新导致重复提交数据。

实现页面模板

模板 templates/message.html:

<html>
<head>
<title> Leave your message here </title>
</head>

<body>
<h1>Messages</h1>

<table>
  {% for message in messages %}
  <tr>
    <td>
    {% if message.homepage %}
      <a href="{{ message.homepage }}">{{ message.name }}</a>
    {% else %}
      {{ message.name }}
    {% endif %}
    ({{ message.email }})
    leave a message at {{ message.time }}
    from {{ message.ip }}:
    </td>
  </tr>
  <tr>
    <td>{{ message.content }}</td>
  </tr>
{% endfor %}
</table>

<h2>Leave your message</h2>
<form action="." method="POST">
  <table>
    {{ form.as_table }}
  </table>
  <p><input type="submit" value="Submit"></p>
</form>

</body>
</html>

其中 as_table 是 form 的一个属性,form.as_table 表示使用表格形式输出时要输出的 HTML 代码。

为保持应用的封装,我们可以在每个应用目录下创建一个模板目录 templates,然后把这个目录添加到项目配置文件 settings.py 中的模板搜索路径中:

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
    os.path.join(os.path.dirname(__file__), 'messages/templates').replace('\\',
'/'),
)

配置访问接口

实现好视图控制后,我们需要修改 urls.py 配置留言板访问接口,可以简单地在 patterns.py 中增加一行:

(r'^message/$', 'myblog.messages.views.message'),

如果希望应用的可移植性更好一些,我们可以为每个应用单独维护一个 urls.py,然后在项目的 urls.py 中引入。

新建 messages/urls.py,内容如下:

from django.conf.urls.defaults import *
from views import *

urlpatterns = patterns('',
    (r'^$', message),
)

然后在项目的 urls.py 中包含它:

urlpatterns = patterns('',
    (r'^$', index),
    (r'^message/', include('myblog.messages.urls')),
)

这样,在访问 http://192.168.1.6:8080/message/ 时,项目中的 urls.py 会匹配 message/,并把匹配完的剩余部分传递给应用中的 urls.py,这里的剩余部分就是空字符串,因此在 messages/urls.py 中的 r'^$' 将会匹配它。

最终效果

访问 http://192.168.1.6:8080/message/,增加几笔留言,你可能会发现时间与当前时间不匹配。这时你需要根据你所在的时区修改一下 settings.py 中的时区:

TIME_ZONE = 'Asia/Shanghai'

如果输入有误,则会在输入错误的表单域上方显示错误提示,如:

如果你希望按你的语言来显示提示信息,则修改 settings.py 中的相应设置,如:

LANGUAGE_CODE = 'zh-CN'

则以上的“This field is required”会变为“这个字段是必填项”。

最终效果如下:

下一节 >>>

Django 快速实战入门(七):admin 应用

Django 自带了不少实用的应用,下一节中我们将介绍如果使用 admin 应用实现留言板的后台管理。

-- EOF --

不是吧,只有一条评论?! »

  1. 藏宝图» Blog Archive » Django 快速实战入门(六):表单模型 说道:

    2009年03月19日 22:23

    [...] 原始链接:http://hily.me/blog/2008/11/learning-django-ch6/ [...]

发表一下您的高见

If you have any question, or for the language problem, please fell free to leave a comment or just contact me with email: hilyjiang [At] Gmail.