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

Ответы:



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

1
Я только что попробовал, не работает. Ответ @miki725 правильный.
Дэниел ван Флимен,

1
Я считаю, что скобка не в том месте: response = client.get (reverse ('edit_project', project_id = 4))
Вим Фейен

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.