编写一个简单的窗体
我们先更新一下detail的代码,里面包含HTML的<from>元素
<h1>{{ poll.account }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <form action="{% url 'jobs:vote' poll.id %}" method="post"> {% csrf_token %} {% 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_text }}</label><br /> {% endfor %} <input type="submit" value="Vote" /> </form>
这个功能也就是像人人网别人的首页上点赞一样,你认同,就在合适的地发点赞。我们来先修改一下views的vote和results,先在整个views应该是这样子的
from django.http import HttpResponse,HttpResponseRedirect from django.core.urlresolvers import reverse from jobs.models import Register,Choice from django.shortcuts import render, get_object_or_404 def index(request): latest_jobs_list = Register.objects.order_by('time') return render(request, 'jobs/index.html', {'latest_jobs_list': latest_jobs_list}) def detail(request, r_id): poll=get_object_or_404(Register,pk=r_id) return render(request,'jobs/detail.html',{'poll':poll}) def results(request, r_id): poll = get_object_or_404(Register, pk=r_id) return render(request, 'jobs/results.html', {'poll': poll}) def vote(request, r_id): p = get_object_or_404(Register, pk=r_id) try: selected_choice = p.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'jobs/detail.html', { 'poll': p, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('jobs:results', args=(p.id,)))
request.POST:是一个类似字典的对象,可以通过获取关键字的值来获取提交的数据,本例子中的request.POST['choice']返回啦所选投票项目的id,以字符串的形式。
如果没有指定POST的值的时候,会引发KeyError事件。
在增加了投票选项的统计数后,代码返回一个 HttpResponseRedirect 对象而不是常见的 HttpResponse 对象。 HttpResponseRedirect 对象需要一个参数:用户将被重定向的 URL 。
我们在 HttpResponseRedirect 的构造方法中使用了 reverse() 函数。 此函数有助于避免在视图中硬编码 URL 的功能。它指定了我们想要的跳转的视图函数名以及视图函数中 URL 模式相应的可变参数。在本例中 reverse() 将会返回类似如下所示的字符串'/polls/3/results/'在此 3 就是 p.id 的值。该重定向 URL 会调用 'results' 视图并显示最终页面。
然后我们编辑result.html页面
<h1>{{ poll.account }}</h1> <ul> {% for choice in poll.choice_set.all %} <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li> {% endfor %} </ul> <a href="{% url 'jobs:detail' poll.id %}">Vote again?</a>