it-swarm.com.ru

Джанго Реверс с аргументами '()' и ключевыми словами '{}' не найден

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

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

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

101
Darwin Tech

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

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

Док здесь

194
miki725

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

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

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

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

0
Srivats Shankar

Решить также проще

from Django.urls import resolve

resolve('edit_project', project_id=4)

Документация по этому ярлыку

0
SebCorbin