171 votes

Django Reverse avec des arguments '()' et des arguments mot-clé '{}' n'a pas été trouvé

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

J'ai un motif d'URL comme ceci :

# mproject/myapp.urls.py

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

ça fonctionne bien dans le navigateur mais pour les tests, lorsque je fais ceci dans la console :

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 je manque ici ?

330voto

miki725 Points 6976

Vous devez spécifier project_id:

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

Doc ici

18voto

Srivats Shankar Points 670

La solution de @miki725 est absolument correcte. Sinon, si vous souhaitez utiliser l'attribut args plutôt que 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 tant qu'arguments. N'oubliez pas que les arguments qui sont passés doivent être assignés une valeur avant d'être inversés. Utilisez simplement le bon espace de noms, qui dans ce cas est 'edit_project'.

4voto

KRH Points 120

Ces problèmes m'ont donné un grand mal de 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 depuis tests.py cela sera pareil. La bonne façon de faire cela est la suivante :

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

#app name - nom de l'application où l'URL est définie
client = Client()
response = client.get(reverse('app_name:edit_project', project_id=4))

3voto

serfer2 Points 359

La manière la plus simple est d'utiliser kwargs avec la fonction reverse() :

from django.test import Client
from django.urls import reverse

url = reverse("edit_project", kwargs={"project_id": 4})
response = Client().get(url)

1voto

SebCorbin Points 672

La fonction resolve_url est également plus directe

from django.shortcuts import resolve_url

resolve_url('edit_project', project_id=4)

Documentation sur ce raccourci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X