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

144

Salut, j'ai un problème exaspérant.

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?

Darwin Tech
la source
dans le dernier django , l'inverse est importé depuis les URL. iefrom django.urls import reverse
suhailvs

Réponses:

261

Vous devez préciser project_id:

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

Doc ici

miki725
la source
1
Pourriez-vous également inclure comment faire cela dans un modèle?
Gershom
1
les documents ont des exemples
miki725
A travaillé comme un cham!
Muhammad Haseeb
6

La solution @ miki725 est absolument correcte. Alternativement, si vous souhaitez utiliser l' argsattribut par opposition à kwargs, vous pouvez simplement modifier votre code comme suit:

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

Un exemple de ceci peut être trouvé dans la documentation . Cela fait essentiellement la même chose, mais les attributs sont passés en arguments. N'oubliez pas que tous les arguments transmis doivent recevoir une valeur avant d'être inversés. Utilisez simplement l'espace de noms correct, ce qui est dans ce cas 'edit_project'.

Srivats Shankar
la source
1
J'aime sa brièveté.
Bartleby
2

Ces problèmes m'ont donné beaucoup de mal à la tête lorsque j'ai essayé d'utiliser la fonction inverse pour générer un lien d'activation et l'envoyer par e-mail bien sûr. Donc, je pense que de tests.py ce sera la même chose. La bonne façon de procéder 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)) 
KRH
la source
1
J'ai juste essayé ça, ça ne marche pas. La réponse de @ miki725 est correcte.
Daniel van Flymen
1
Je pense qu'une accolade est au mauvais endroit: response = client.get (reverse ('edit_project', project_id = 4))
Wim Feijen
1

Resolve est également plus simple

from django.urls import resolve

resolve('edit_project', project_id=4)

Documentation sur ce raccourci

SebCorbin
la source
respectueusement essayé et ne fonctionne pas pour moi. Je vais m'en tenir à l'inverse. 2018 django 2
HashRocketSyntax