Este es mi url.py.
Código:
.. 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.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'), )
Este parte de html le pasa los datos tema y post al url pattern "post":
Código:
Luego esta función le pasa "tema" y "post" en un context al html de arriba:<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>
Código:
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.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)
El url "respuesta" redirige a esta función de views.py:
Código:
Ok está un poco largo. . 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)))
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.