Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] No reverse match. .. Problema con url patterns.

Estas en el tema de No reverse match. .. Problema con url patterns. en el foro de Python en Foros del Web. Hola todos. Tengo un problema y creo q es porque me falta teoría sobre cómo funcionan los url patterns. Este es mi url.py. Código: from ...
  #1 (permalink)  
Antiguo 01/02/2014, 11:54
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
No reverse match. .. Problema con url patterns.

Hola todos. Tengo un problema y creo q es porque me falta teoría sobre cómo funcionan los url patterns.

Este es mi url.py.

Código:
from temas import views

urlpatterns = patterns('',
	url(r'^$', views.main, name = 'main'),
	url(r'^nuevo_tema/$', views.nuevo_tema, name = 'nuevo_tema'),
	url(r'^(?P<titulo>\w+)/$', views.index_tema, name = 'index_tema'),
	url(r'^(?P<tema>\w+)/sumar_post/$', views.sumar_post, name = 'sumar_post'),
	url(r'^(?P<tema>\w+)/nuevo_post/$', views.nuevo_post, name = 'nuevo_post'),
	url(r'^(?P<tema>\w+)/post/(?P<post_id>\d+)/$', views.post, name = 'post'),
	url(r'^(?P<tema>\w+)/post/(?P<post_id>\d+)/respuesta$', views.respuesta, name = 'respuesta'),
	)
.. El problema surge con el url "respuesta", el último. Requiere de dos argumentos, "tema" y "post_id". Los últimos dos urls, el de post y el de respuesta están relativamente encadenados.

Este parte de html le pasa los datos tema y post al url pattern "post":

Código:
	<ul>
		<li> Post: {{ post.texto }} </li>
		<li> Creador: {{ post.creador }} </li>
		<div>
			<form action = "{% url 'temas:respuesta' tema.nombre post.id %}" method = "POST">
				{{form_respuesta.as_ul}}
			<imput type = "submit" value = "Responder">
		</div>	
	</ul>
Luego esta función le pasa "tema" y "post" en un context al html de arriba:

Código:
def post(request, tema, post_id):
	form_respuesta = FormNuevoPost() 
	post = Posts.objects.get(id=post_id)
	context = {'tema': tema, 'post':post, 'form_respuesta': form_respuesta}
	return render(request, 'temas/post.html', context)
Como pueden ver en el html, debajo del titulo y del creador del Post, paso un Form donde el usuario va a poner una respuesta. Ese form tiene como "action" al url "respuesta" y le pasa dos argumentos: tema.nombre y post.id.

El url "respuesta" redirige a esta función de views.py:

Código:
def respuesta(request, tema, post_id):
	if request.method == "POST":
		form = FormNuevoPost(request.POST)
		if form.is_valid():
			texto = form.cleaned_data.get('texto')
			perfil_usuario = Perfiles.objects.get(usuario=request.user)
			tema_contenedor = Temas.objects.get(nombre = tema)
			post_padre = Posts.objects.get(id=post_id)
			post_respuesta = Post(texto=texto, es_respuesta = True, creador = perfil_usuario,
				tema = tema_contenedor)
			respuesta_db = Respuestas(post_respuesta=post_respuesta, post_padre = post_padre)
			post_respuesta.save()
			respuesta_db.save()
			return HttpResponseRedirect(reverse('temas:post', args =(tema_contenedor.nombre, post_padre.id)))
		else:
			pass #!!! enviar errores
	else:
		tema = Temas.objects.get(nombre = tema)

		return HttpResponseRedirect(reverse('temas:post', args =(tema.nombre, post_id)))
Ok está un poco largo. .
El error es::
"Reverse for 'respuesta' with arguments '('', 4L)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'temas/(?P<tema>\\w+)/post/(?P<post_id>\\d+)/respuesta$']"

Y el traceback señala la línea del form:

<form action = "{% url 'temas:respuesta' tema.nombre post.id %}" method = "POST">
Como inicio del error..

Según yo sí le estoy pasando los argumentos al url pattern para que funcione.

Les agradezco cualquier sugerencia, incluso si me pueden plantear una manera de mejorar mi código.
  #2 (permalink)  
Antiguo 01/02/2014, 14:32
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: No reverse match. .. Problema con url patterns.

Lo que pasa es simple:

Le dices a django, en la url llamada respuesta.

url(r'^(?P<tema>\w+)/post/(?P<post_id>\d+)/respuesta$', views.respuesta, name = 'respuesta')

Usa estos parámetros. ('', 4L) y {} y genera una url valida.

Al ver que '' (cadena vacia) no coincide con \w+, porque requiere al menos un carácter esto falla. Y te da ese error.

La razón es simple tema.nombre es una cadena vacía.
  #3 (permalink)  
Antiguo 02/02/2014, 09:50
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 11 años, 11 meses
Puntos: 7
Respuesta: No reverse match. .. Problema con url patterns.

Hola, trata con:

Código Python:
Ver original
  1. url(r'^(?P<slug_tema>[-_\w]+)/post/(?P<post_id>\d+)/respuesta$', views.respuesta, name = 'respuesta'),

Tu codigo se puede mejorar mucho, ahora no tengo tiempo pero tratare de ver lo que ocurre.
  #4 (permalink)  
Antiguo 04/02/2014, 17:05
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
Respuesta: No reverse match. .. Problema con url patterns.

Gracias por sus comments. Me ayudaron a solucionarlo, el error estaba claro.

Macintosh, puedes recomendarme qué tipo de mejoras le puedo hacer a mi código. Si no tienes tiempo te agradezco unos lineamientos generales sobre qué debo investigar.

Saludos.

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:33.