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.