Django Reverse mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden

144

Hallo, ich habe ein ärgerliches Problem.

Ich habe ein URL-Muster wie dieses:

# mproject/myapp.urls.py

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

es funktioniert gut im Browser, aber zum Testen, wenn ich dies in der Shell mache:

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

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

Ich bekomme das gefürchtete:

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

Was fehlt mir hier?

Darwin Tech
quelle
Im letzten Django wird das Reverse aus URLs importiert. dhfrom django.urls import reverse
suhailvs

Antworten:

261

Sie müssen angeben project_id:

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

Doc hier

miki725
quelle
1
Könnten Sie möglicherweise auch in eine Vorlage aufnehmen, wie dies zu tun ist?
Gershom
1
Dokumente haben Beispiele
miki725
Arbeitete wie eine Cham!
Muhammad Haseeb
6

Die Lösung @ miki725 ist absolut korrekt. Alternativ, wenn Sie die verwenden möchtenargs Attribut im Gegensatz zu verwendenkwargs , können Sie Ihren Code einfach wie folgt ändern:

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

Ein Beispiel hierfür finden Sie in der Dokumentation . Dies macht im Wesentlichen dasselbe, aber die Attribute werden als Argumente übergeben. Denken Sie daran, dass übergebenen Argumenten vor dem Umkehren ein Wert zugewiesen werden muss. Verwenden Sie einfach den richtigen Namespace, in diesem Fall 'edit_project'.

Srivats Shankar
quelle
1
Ich mag seine Kürze.
Bartleby
2

Diese Probleme bereiteten mir große Kopfschmerzen, als ich versuchte, Reverse zum Generieren eines Aktivierungslinks zu verwenden und ihn natürlich per E-Mail zu senden. Also ich denke von tests.py wird es das gleiche sein. Der richtige Weg, dies zu tun, ist folgender:

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
quelle
1
Ich habe es gerade versucht, es funktioniert nicht. Die Antwort von @ miki725 ist korrekt.
Daniel van Flymen
1
Ich glaube, eine Zahnspange ist am falschen Ort: response = client.get (reverse ('edit_project', project_id = 4))
Wim Feijen
1

Das Auflösen ist auch einfacher

from django.urls import resolve

resolve('edit_project', project_id=4)

Dokumentation zu dieser Verknüpfung

SebCorbin
quelle
respektvoll versucht und nicht für mich arbeiten. Ich werde bei der Rückseite bleiben. 2018 django 2
HashRocketSyntax