Django Reverse с аргументами '()' и аргументами ключевого слова '{}' не найдено

Привет, у меня есть проблема беспризорности.

У меня есть шаблон 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.

Что мне здесь не хватает?

Ответ 1

Вы должны указать project_id:

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

Doc здесь

Ответ 2

Эти проблемы вызвали у меня сильную головную боль, когда я попытался использовать реверс для создания ссылки активации и, разумеется, отправил ее по электронной почте. Поэтому я думаю, что из 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)) 

Ответ 4

Решение @miki725 абсолютно правильно. В качестве альтернативы, если вы хотите использовать атрибут args а не kwargs, вы можете просто изменить свой код следующим образом:

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

Пример этого можно найти в документации. По сути, это делает то же самое, но атрибуты передаются в качестве аргументов. Помните, что переданным аргументам необходимо присвоить значение, прежде чем они будут сторнированы. Просто используйте правильное пространство имен, которое в этом случае 'edit_project'.

Ответ 5

"app_name" - это пространство имен, которое вы указали в конфигурации url, а не фактическое имя приложения.

Правильный способ заключается в добавлении дополнительного параметра в конфигурацию url - "namespace", это было бы актуально для "app_name", которое был указан user2517191, и "edit_project" в client.get(reverse ('app_name: edit_project ") будет параметром имени, который вы указали в конфигурации URL.