2009-07-30 10 views
10

Soy bastante nuevo en python y lo sigo junto con la parte 4 del tutorial para el framework Django here. Estoy tratando de poner en práctica las vistas genéricas para la aplicación de las encuestas - mi código parece correcto (por lo que yo puedo decir), pero cuando trato de votar, me sale una excepción NoReverseMatch que dice:NoReverseMatch Excepción ayuda en Django

inversa para 'polls/poll_results' con argumentos '(1L,)' y argumentos de palabras clave '{}' no encontrados.

Mi código funcionaba perfectamente antes de intentar las vistas genéricas, pero parece que no puedo identificar el problema ahora.

Aquí está el código para mi urls.py en el directorio de sondeo:

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

Y aquí es el 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,))) 

Tengo la sensación de que es un error sintáctico, pero no puedo encontrarlo Gracias de antemano por cualquier ayuda ...

Respuesta

5

trate de usar:

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

Gracias - eso funcionó. ¿Podría explicar cómo difiere de la versión del tutorial y por qué no funcionaba antes? – mportiz08

+0

No sé sobre el tutorial. Pero parece que la vista genérica está usando argumentos de palabra clave. El resolver inverso combina args y kwargs por separado, por lo que cuando pasa args, no coincide con la vista que usa kwargs. Pero cuando pasas kwargs, funciona. ¿Tener sentido? – bstpierre

+0

Sí, muchas gracias! – mportiz08

1

¿Estas seguro que es donde realmente es el error? Según el mensaje de error, suena como en una vista o en una plantilla que intenta revertir 'polls/poll_results' (en una plantilla, puede estar haciendo algo como {% url polls/poll_results poll.pk %})

+0

Estoy haciendo algo como esto en mi plantilla pero no entiendo por qué es – michela

0

He intentado con la solución provista como respuesta y no funcionó para mí En mi caso, recibía el mismo error (siguiendo el mismo tutorial) y el problema era que el nombre de la vista en el archivo urls.py era un poco diferente en el views.py (porque era un error de tipeo).

1

no pude encontrar ninguna explicación que solucionó el problema, hasta que me encontré con esta persona abreviada Django tutorial: http://tony.abou-assaleh.net/web-development/stripped-down-django-tutorial

Se trata básicamente de una línea en la plantilla de detalles, lo que debería ser:

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

En lugar de:

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

No estoy seguro de por qué esto solucionó el problema, pero lo hizo por mí. Me encantaría una explicación si alguien tiene una.

+7

Si está usando 1.4.1 elimine el '' alrededor de las encuestas.vistas.voto –

Cuestiones relacionadas