Django Reverse z argumentami „()” i słowami kluczowymi „{}” nie znaleziono

144

Cześć, mam irytujący problem.

Mam taki wzorzec adresu URL:

# mproject/myapp.urls.py

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

działa dobrze w przeglądarce, ale do testów, kiedy robię to w powłoce:

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

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

Jestem przerażony:

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

Czego tu brakuje?

Darwin Tech
źródło
w ostatnim django rewers jest importowany z adresów URL. iefrom django.urls import reverse
suhailvs

Odpowiedzi:

261

Musisz określić project_id:

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

Doktor tutaj

miki725
źródło
1
Czy mógłbyś również zawrzeć, jak to zrobić w szablonie?
Gershom
1
dokumenty mają przykłady
miki725
Pracował jak cham!
Muhammad Haseeb
6

Rozwiązanie @ miki725 jest absolutnie poprawne. Alternatywnie, jeśli chcesz użyć argsatrybutu, a nie atrybutu kwargs, możesz po prostu zmodyfikować kod w następujący sposób:

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

Przykład tego można znaleźć w dokumentacji . Zasadniczo robi to to samo, ale atrybuty są przekazywane jako argumenty. Pamiętaj, że wszystkie przekazywane argumenty muszą mieć przypisaną wartość, zanim zostaną odwrócone. Po prostu użyj poprawnej przestrzeni nazw, którą w tym przypadku jest 'edit_project'.

Srivats Shankar
źródło
1
Podoba mi się jego zwięzłość.
Bartleby
2

Te problemy przyprawiały mnie o wielki ból głowy, gdy próbowałem użyć rewersu do wygenerowania linku aktywacyjnego i oczywiście wysłać go e-mailem. Więc myślę, że z tests.py będzie tak samo. Prawidłowy sposób na zrobienie tego jest następujący:

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
źródło
1
Właśnie tego spróbowałem, ale to nie działa. Odpowiedź @ miki725 jest prawidłowa.
Daniel van Flymen
1
Uważam, że nawias klamrowy jest w złym miejscu: response = client.get (reverse ('edit_project', project_id = 4))
Wim Feijen,
1

Rozwiązanie jest również prostsze

from django.urls import resolve

resolve('edit_project', project_id=4)

Dokumentacja dotycząca tego skrótu

SebCorbin
źródło
z szacunkiem próbował i nie działa dla mnie. zamierzam trzymać się wstecz. 2018 django 2
HashRocketSyntax