Django Inverso con argumentos '()' y argumentos de palabras clave '{}' no encontrados

144

Hola, tengo un problema exasperante.

Tengo un patrón de URL como este:

# mproject/myapp.urls.py

url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),

funciona bien en el navegador pero para probar, cuando hago esto en el shell:

from django.test import Client
from django.core.urlresolvers import reverse

client= Client()
response = client.get(reverse('edit_project'), project_id=4)

Me da miedo:

NoReverseMatch: Reverse for 'edit_project' with arguments '()' and keyword arguments '{}' not found.

¿Que me estoy perdiendo aqui?

Darwin Tech
fuente
en el último django , el reverso se importa de las URL. es decirfrom django.urls import reverse
suhailvs

Respuestas:

261

Tienes que especificar project_id:

reverse('edit_project', kwargs={'project_id':4})

Doc aquí

miki725
fuente
1
¿Podría incluir también cómo hacer esto dentro de una plantilla?
Gershom
1
los documentos tienen ejemplos
miki725
Funcionó como un cham!
Muhammad Haseeb
6

La solución @ miki725 es absolutamente correcta. Alternativamente, si desea utilizar el argsatributo en lugar de kwargs, entonces simplemente puede modificar su código de la siguiente manera:

project_id = 4
reverse('edit_project', args=(project_id,))

Un ejemplo de esto se puede encontrar en la documentación . Esto esencialmente hace lo mismo, pero los atributos se pasan como argumentos. Recuerde que cualquier argumento que se pase debe tener asignado un valor antes de ser revertido. Simplemente use el espacio de nombres correcto, que en este caso es 'edit_project'.

Srivats Shankar
fuente
1
Me gusta su brevedad.
Bartleby
2

Este problema me causó un gran dolor de cabeza cuando intenté usar el reverso para generar el enlace de activación y, por supuesto, enviarlo por correo electrónico. Así que creo que de tests.py será lo mismo. La forma correcta de hacer esto es la siguiente:

from django.test import Client
from django.core.urlresolvers import reverse

#app name - name of the app where the url is defined
client= Client()
response = client.get(reverse('app_name:edit_project', project_id=4)) 
KRH
fuente
1
Acabo de intentar esto, no funciona. La respuesta de @ miki725 es correcta.
Daniel van Flymen
1
Creo que una llave está en el lugar incorrecto: respuesta = client.get (reverse ('edit_project', project_id = 4))
Wim Feijen
1

Resolver también es más sencillo

from django.urls import resolve

resolve('edit_project', project_id=4)

Documentación sobre este atajo

SebCorbin
fuente
Respetuosamente probado y no funciona para mí. Me voy a quedar con el reverso. 2018 django 2
HashRocketSyntax