Django中NoReverseMatch异常帮助

10 投票
4 回答
19394 浏览
提问于 2025-04-15 13:16

我刚开始学习Python,正在跟着Django框架的教程第四部分学习,这里有链接。我正在尝试为投票应用实现通用视图——我的代码看起来是正确的(就我所知),但是当我尝试投票时,出现了一个“NoReverseMatch异常”,提示:

找不到 'polls/poll_results' 的反向路径,参数是 '(1L,)',关键字参数是 '{}'。

在我尝试通用视图之前,我的代码运行得很好,但现在我找不到问题出在哪里。

这是我在投票目录下的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,)))

我觉得可能是语法错误,但我找不到。提前谢谢大家的帮助...

4 个回答

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">

我不太明白为什么这样就解决了问题,但对我来说确实有效。如果有人能解释一下,我会很感激。

1

你确定你的错误真的是在那个地方吗?根据错误信息来看,听起来你可能是在一个视图或者模板中试图反向解析 'polls/poll_results'(在模板中,你可能在做类似 {% url polls/poll_results poll.pk %} 的事情)。

5

试试这个:

return HttpResponseRedirect(reverse('poll_results', kwargs={'object_id': p.id}))

撰写回答