我是python的新手,并继续阅读Django框架here教程的第4部分。我正在尝试为民意调查应用程序实现通用视图 - 我的代码似乎是正确的(据我所知),但当我尝试投票时,我得到一个NoReverseMatch异常,声明:
使用参数'(1L,)'和未找到关键字参数'{}'来反转'polls / poll_results'。
在我尝试通用视图之前,我的代码工作正常,但我现在无法查明问题。
以下是poll目录中urls.py的代码:
from django.conf.urls.defaults import *
from djtest.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/$', 'djtest.polls.views.vote'),
)
这是views.py:
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.core.urlresolvers import reverse
from djtest.polls.models import Poll, Choice
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 form
return render_to_response('polls/poll_detail.html', {
'object': p,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))
我觉得这是一个语法错误,但我找不到它。提前感谢您的帮助......
答案 0 :(得分:5)
尝试使用:
return HttpResponseRedirect(reverse('poll_results', kwargs={'object_id': p.id}))
答案 1 :(得分:1)
你确定你的错误确实存在吗?基于错误消息,它听起来像是在视图中或模板中您试图反转'polls/poll_results'
(在模板中,您可能正在执行{% url polls/poll_results poll.pk %}
之类的操作)
答案 2 :(得分:1)
我找不到解决问题的任何解释,直到我遇到这个人的精简Django教程:http://tony.abou-assaleh.net/web-development/stripped-down-django-tutorial
它基本上是详细信息模板中的一行,应该是:
<form action="/polls/{{ poll.id }}/vote/" method="post">
而不是:
<form action="{% url 'polls.views.vote' poll.id %}" method="post">
我不确定为什么这会解决问题,但它确实对我有用。如果有人有解释,我会喜欢解释。
答案 3 :(得分:0)
我已经尝试了解决方案提供的解决方案,并没有为我工作。在我的情况下,我得到相同的错误(遵循相同的教程),问题是urls.py文件中的视图名称与views.py中的视图名称有点不同(因为输入错误)。