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?
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))
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'
.
La résolution est aussi plus simple
from Django.urls import resolve
resolve('edit_project', project_id=4)