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?


w ostatnim django rewers jest importowany z adresów URL. iefrom django.urls import reverse
suhailvs

Odpowiedzi:



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'.


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)) 

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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.