Django 1.0 中文文档-----指导 第四部分 编写表单

编写一个简单的表单

 

我们更新下投票详情(“polls/detail.html”) ,加入<form>元素

 

<h1>{{ poll.question }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="/polls/{{ poll.id }}/vote/" method="post">
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

 

简短概要分析

 

上面模板为每个投票选项显示了一个单选钮. 单选钮的值关联到每个选项的ID, 每个单选钮都命名为 "choice". 这表示, 当一个选择一个然后提交,将会发送数据如choice=3. 我们设置表单的  action 为 /polls/{{ poll.id }}/vote/, 并且设置 method="post". 使用 method="post" (不要用 method="get") 是很重要的, 因为提交后表单数据会在服务端修改.每当创建服务端修改的表单,使用 method="post". 这个建议不仅限于Django; 这是一个很好的WEB开发习惯. forloop.counter 索引表示 for 循环通过了几次

 

现在我们建立视图来处理提交的数据,还记得我们讲过的 URLconf

 

(r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),

我们在mysite/polls/views.py:中创建vote()函数。

 

from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from mysite.polls.models import Choice, Poll
# ...
def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the poll voting form.
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('mysite.polls.views.results', args=(p.id,)))

 

 

request.POST 是提交数据的字典(POST方式). 这里, request.POST['choice'] 得到选着的选项ID, 字符类型. request.POST 值都是字符.

注意Django也提供 request.GET 接受GET请求的参数-- 但是我们实际用的 request.POST 在代码 里, 确保数据为POST提交.

request.POST['choice'] 这样写如果POST里没有choice参数会发生异常 .

增加选项之后,代码返回一个 HttpResponseRedirect 而不是普通的 HttpResponse. HttpResponseRedirect 有一个参数: URL将会被重定向 。

当成功处理完提交数据后返回一个 HttpResponseRedirect 也是个好的WEB开发习惯.

我们使用 reverse() 函数在 HttpResponseRedirect 构造器. 会把参数传递给指定的视图。

'/polls/3/results/'

 

投票完成会跳到结果视图

 

def results(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/results.html', {'poll': p})

 

 

创建 result.html 模板

 

<h1>{{ poll.question }}</h1>

<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

 

 

 

使用一般视图:写更少的代码

 

from django.conf.urls.defaults import *

urlpatterns = patterns('mysite.polls.views',
    (r'^$', 'index'),
    (r'^(?P<poll_id>\d+)/$', 'detail'),
    (r'^(?P<poll_id>\d+)/results/$', 'results'),
    (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
)

 

 

改成如下

from django.conf.urls.defaults import *
from mysite.polls.models import Poll

info_dict = {
    'queryset': Poll.objects.all(),
}

urlpatterns = patterns('',
    (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
    (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
    url(r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html'), 'poll_results'),
    (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
)

 

我们使用了两个一般视图: object_list()object_detail(). 两个抽象的视图分别显示一个 列表对象 和一个详细内容对象。

 

  • 每个一般视图需要知道显示那些数据,数据通过字典提供,queryset 对应了数据列表
  • object_detail() 一般视图会从URL上俘获ID值,名字是"object_id",所以我们需要把poll_id 改成 object_id
  • poll_results (见原文)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值