Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/02/2014, 11:54
Avatar de stormearth
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.