Ответ 1
Попробуйте использовать:
return HttpResponseRedirect(reverse('poll_results', kwargs={'object_id': p.id}))
Я новичок в python и следую вместе с частью 4 учебника для рамки Django здесь. Я пытаюсь реализовать общие представления для приложения опросов - мой код кажется правильным (насколько я могу судить), но когда я пытаюсь проголосовать, я получаю исключение NoReverseMatch, которое гласит:
Реверс для 'опросов/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'),
)
И вот view.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,)))
У меня такое ощущение, что это синтаксическая ошибка, но я не могу ее найти. Заранее спасибо за любую помощь...
Попробуйте использовать:
return HttpResponseRedirect(reverse('poll_results', kwargs={'object_id': p.id}))
Вы уверены, что, где ваша ошибка на самом деле? Основываясь на сообщении об ошибке, это похоже либо в виде, либо в шаблоне, который вы пытаетесь отменить 'polls/poll_results'
(в шаблоне вы можете делать что-то вроде {% url polls/poll_results poll.pk %}
)
Я не мог найти объяснений, которые фиксировали проблему, пока я не натолкнулся на этот укрупненный учебник 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">
Я не уверен, почему это решило проблему, но это было для меня. Мне понравилось бы объяснение, если у кого-нибудь есть.
Я пробовал решение, предоставленное в качестве ответа, и не работал у меня. В моем случае я получал ту же ошибку (после того же самого учебника), и проблема заключалась в том, что имя представления в файле urls.py было немного иным, чем в view.py(из-за ошибки ввода).