2009-07-30 50 views
10

我对python相当陌生,并且遵循Django框架here的教程第4部分。我试图实现对投票程序通用视图 - 我的代码似乎是正确的(只要我可以告诉),但是当我试投,我得到一个NoReverseMatch异常,指出:Django的NoReverseMatch异常帮助

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

在尝试使用通用视图之前,我的代码工作完美,但我现在似乎无法找到问题所在。

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

我有一种感觉,这是一个语法错误,但我找不到它。在此先感谢您的帮助......

回答

5

尝试使用:

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

谢谢 - 工作。你可能会解释它与教程中的版本有什么不同,以及它之前为什么没有工作? – mportiz08 2009-07-30 05:29:50

+0

不知道教程。但似乎通用视图是使用关键字参数。反向解析器分别与args和kwargs匹配,所以当你传递参数时,它与使用kwargs的视图不匹配。但是当你通过kwargs时,它是有效的。合理? – bstpierre 2009-07-30 18:26:26

+0

是的,非常感谢! – mportiz08 2009-07-30 20:52:23

1

你确定这就是你的错误真的是?根据错误消息,它听起来像是在视图中或模板中您想要反转'polls/poll_results'(在模板中,您可能正在做类似于{% url polls/poll_results poll.pk %}的操作)

0

我已尝试提供的解决方案作为答案,没有为我工作。在我的情况下,我得到了同样的错误(遵循相同的教程),问题是urls.py文件中的视图名称与views.py中的视图名称有些不同(因为输入错误)。

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

我不知道为什么这解决了问题,但它为我做了。如果有人有解释,我会很乐意解释。