web-dev-qa-db-fra.com

Django Reverse avec les arguments '()' et le mot clé '{}' non trouvé

Salut j'ai un problème énervant.

J'ai un modèle d'URL comme celui-ci:

# mproject/myapp.urls.py

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

cela fonctionne bien dans le navigateur, mais pour les tests, quand je fais cela dans le shell

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

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

Je reçois le redouté:

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

Qu'est-ce que j'oublie ici? 

101
Darwin Tech

Vous devez spécifier project_id:

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

Doc ici

194
miki725

Ces problèmes m'ont donné un gros mal de tête lorsque j'ai essayé d'utiliser reverse pour générer un lien d'activation et de l'envoyer par e-mail bien sûr. Donc, je pense que de tests.py, ce sera pareil. La bonne façon de faire est la suivante:

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)) 
2
KRH

La solution @ miki725 est absolument correcte. Sinon, si vous souhaitez utiliser l'attribut args au lieu de kwargs, vous pouvez simplement modifier votre code comme suit:

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

Vous trouverez un exemple dans la documentation . Cela fait essentiellement la même chose, mais les attributs sont passés en tant qu'arguments. N'oubliez pas que tous les arguments transmis doivent recevoir une valeur avant d'être inversés. Utilisez simplement le nom correct, qui dans ce cas est 'edit_project'.

0
Srivats Shankar

La résolution est aussi plus simple

from Django.urls import resolve

resolve('edit_project', project_id=4)

Documentation sur ce raccourci

0
SebCorbin