<h1>{{ poll.question }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url \'polls: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>
现在,让我们来创建一个 Django 视图来处理提交的数据。 记得吗?在s中,我们为上一篇博客中polls 应用创建了一个 URLconf 配置中包含有这一行代码:
url(r\'^(?P<poll_id>\\d+)/vote/$\', views.vote, name=\'vote\'),
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from 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(request, \'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(\'polls:results\', args=(p.id,)))
def results(request, poll_id):
poll = get_object_or_404(Poll, pk=poll_id)
return render(request, \'results.html\', {\'poll\': poll})
<h1>{{ poll.question }}</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 \'polls:detail\' poll.id %}">Vote again?</a>