Справка по исключениям NoReverseMatch в Django - PullRequest
10 голосов
/ 30 июля 2009

Я довольно новичок в Python и следую вместе с 4-й частью учебника по фреймворку 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 ]

5 голосов
/ 30 июля 2009

Попробуйте использовать:

return HttpResponseRedirect(reverse('poll_results', kwargs={'object_id': p.id}))
1 голос
/ 14 августа 2012

Я не мог найти никакого объяснения, которое решило бы проблему, пока я не наткнулся на сокращенное руководство по 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 голос
/ 30 июля 2009

Вы уверены, что именно здесь ваша ошибка?Судя по сообщению об ошибке, оно звучит как в представлении или в шаблоне, который вы пытаетесь изменить 'polls/poll_results' (в шаблоне вы можете делать что-то вроде {% url polls/poll_results poll.pk %})

0 голосов
/ 14 января 2012

Я попробовал решение, предоставленное в качестве ответа, и у меня не сработало. В моем случае я получал ту же ошибку (следуя тому же учебнику), и проблема заключалась в том, что имя представления в файле urls.py немного отличалось от имени в views.py (из-за ошибки при печати). *

...