编写一个简单的窗体
我们先更新一下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>
先在访问 http://127.0.0.1:8009/jobs/1/赞。然后就能及时地更新。