Ответ 1
Вы должны указать project_id
:
reverse('edit_project', kwargs={'project_id':4})
Doc здесь
Привет, у меня есть проблема беспризорности.
У меня есть шаблон url:
# mproject/myapp.urls.py
url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),
он отлично работает в браузере, но для тестирования, когда я делаю это в оболочке:
from django.test import Client
from django.core.urlresolvers import reverse
client= Client()
response = client.get(reverse('edit_project'), project_id=4)
Я получаю страшное:
NoReverseMatch: Reverse for 'edit_project' with arguments '()' and keyword arguments '{}' not found.
Что мне здесь не хватает?
Вы должны указать project_id
:
reverse('edit_project', kwargs={'project_id':4})
Doc здесь
Эти проблемы вызвали у меня сильную головную боль, когда я попытался использовать реверс для создания ссылки активации и, разумеется, отправил ее по электронной почте. Поэтому я думаю, что из tests.py это будет то же самое. Правильный способ сделать это заключается в следующем:
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))
Решение также более прямолинейно
from django.urls import resolve
resolve('edit_project', project_id=4)
Решение @miki725 абсолютно правильно. В качестве альтернативы, если вы хотите использовать атрибут args
а не kwargs
, вы можете просто изменить свой код следующим образом:
project_id = 4
reverse('edit_project', args=(project_id,))
Пример этого можно найти в документации. По сути, это делает то же самое, но атрибуты передаются в качестве аргументов. Помните, что переданным аргументам необходимо присвоить значение, прежде чем они будут сторнированы. Просто используйте правильное пространство имен, которое в этом случае 'edit_project'
.
"app_name" - это пространство имен, которое вы указали в конфигурации url, а не фактическое имя приложения.
Правильный способ заключается в добавлении дополнительного параметра в конфигурацию url - "namespace", это было бы актуально для "app_name", которое был указан user2517191, и "edit_project" в client.get(reverse ('app_name: edit_project ") будет параметром имени, который вы указали в конфигурации URL.