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

148

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

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

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

Дарвин Тек
источник
в последнем django обратный импорт импортируется из URL-адресов. iefrom django.urls import reverse
suhailvs

Ответы:

271

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

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

Док здесь

miki725
источник
1
Не могли бы вы также включить в шаблон, как это сделать?
Gershom
1
в документации есть примеры
miki725 02
Работал как чам!
Мухаммад Хасиб,
8

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

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

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

Сривац Шанкар
источник
1
Мне нравится его краткость.
Бартлби,
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)) 
KRH
источник
1
Я только что попробовал, не работает. Ответ @miki725 правильный.
Дэниел ван Флимен,
1
Я считаю, что скобка не в том месте: response = client.get (reverse ('edit_project', project_id = 4))
Вим Фейен
1

Resolve также проще

from django.urls import resolve

resolve('edit_project', project_id=4)

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

SebCorbin
источник
уважительно попробовал и не работал у меня. Я собираюсь придерживаться реверса. Django 2 2018
HashRocketSyntax 04