编写一个简单的表单
我们更新下投票详情(“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 (见原文)
分享到:
相关推荐
Django 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.doc
django 1.0官方的使用文档chm打包
python库,解压后可用。 资源全名:django_admin_multilang-1.0-py3-none-any.whl
Django1.0以上版本的教材-DjangoBook2.0中文版.pdf 适用于Django1.0以上的环境
django-python3-ldap, python 3的Django LDAP用户身份验证后端 django-python3-ldapdjango-python3-ldap 为 python 2和 3提供了一个 Django LDAP用户身份验证后端。特性使用LDAP服务器验证用户身份。将LDAP用户与...
资源来自pypi官网。 资源全名:django-tables2-column-shifter-0.3.0.tar.gz
资源分类:Python库 所属语言:Python 资源全名:djangocms_algolia-1.3.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...
Django1.0速查手册,Django 1.0 Cheat sheet
django-admin-bootstrap-master.zip
资源来自pypi官网。 资源全名:django_pumaska-1.0rc2-py3-none-any.whl
django-classy-tags, 基于类的Django 模板标记 django-classy-tags请参考文档/目录中的文档以获得帮助。 有关HTML呈现版本的信息,请参见这里的 。 这里项目这个项目的目标是创建一种新的编写 Django 模板标签的方法...
1、基于Django+Django -Rest-Framework+Python的在线考试系统后端(源码).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...
项目概述:django-lb-workflow 是一个基于Python的高效易用Django流程引擎源码,旨在轻松集成至现有系统。该项目主要由68个Python文件、30个HTML文件以及其他相关文件构成,共计136个文件。其中还包括了HTML模板、...
django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 5.7(一定...
Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:django_anymail-4.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:django-microsip-base-1.0.5.zip