2009-07-30 14 views
10

Jestem całkiem nowym użytkownikiem Pythona i kontynuacją części 4 samouczka dla środowiska Django here. Próbuję zaimplementować ogólne widoki dla aplikacji ankiet - mój kod wydaje się poprawny (o ile wiem), ale kiedy próbuję głosować, otrzymuję wyjątek NoReverseMatch, który stwierdza:Pomoc wyjątku NoReverseMatch w Django

Wstecz dla "polls/poll_results" z argumentami "(1L,)" i nie znaleziono argumentów słów kluczowych "{}".

Mój kod działał idealnie, zanim spróbowałem generycznych widoków, ale nie mogę teraz zidentyfikować problemu.

Oto kod dla mojego urls.py w katalogu ankieta

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'), 
) 

A oto 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,))) 

Mam wrażenie, że jest to błąd składniowy, ale nie mogę go znaleźć. Dzięki z góry za wszelką pomoc ...

Odpowiedz

5

Spróbuj użyć:

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

Dzięki - to działało. Czy mógłbyś wyjaśnić, jak to się różni od wersji w samouczku i dlaczego wcześniej nie działało? – mportiz08

+0

Nie wiem o samouczku. Ale wygląda na to, że ogólny widok używa argumentów słów kluczowych. Odwracalny resolver dopasowuje argumenty i kwargs osobno, więc gdy przechodziłeś args, nie pasował on do widoku, w którym użyto kwargs. Ale kiedy mijasz kwargs, działa. Ma sens? – bstpierre

+0

Tak, wielkie dzięki! – mportiz08

1

Czy jesteś pewien, że to błąd, gdzie naprawdę jest? W oparciu o komunikat o błędzie, brzmi to jak w widoku lub w szablonie, który próbujesz odwrócić 'polls/poll_results' (w szablonie, możesz zrobić coś w rodzaju {% url polls/poll_results poll.pk %})

+0

Robię coś takiego w moim szablonie, ale nie rozumiem, dlaczego to jest – michela

0

Próbowałem rozwiązanie dostarczone jako odpowiedź i nie zadziałał dla mnie. W moim przypadku otrzymałem ten sam błąd (po tym samym samouczku), a problem polegał na tym, że nazwa widoku w pliku urls.py była nieco inna niż w views.py (z powodu błędu pisania).

1

nie mogłem znaleźć żadnego wyjaśnienia, że ​​problem został rozwiązany, aż natknąłem tej osoby skróconej tutorialu Django: http://tony.abou-assaleh.net/web-development/stripped-down-django-tutorial

Jest to w zasadzie linia w szablonie szczegółów, które powinny być:

<form action="/polls/{{ poll.id }}/vote/" method="post"> 

Zamiast:

<form action="{% url 'polls.views.vote' poll.id %}" method="post"> 

Nie jestem pewien, dlaczego to rozwiązało problem, ale dla mnie. Chciałbym wyjaśnienie, jeśli ktoś je ma.

+7

Jeśli używasz 1.4.1, usuń "wokół polls.views.vote –