没有找到带有参数'()'和关键字参数'{}'的Django Reverse

时间:2012-11-02 20:12:21

标签: django django-testing

嗨,我有一个令人生气的问题。

我有这样的网址模式:

# mproject/myapp.urls.py

url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),

它可以在浏览器中正常工作但是为了测试,当我在shell中执行此操作时:

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.

我在这里缺少什么?

4 个答案:

答案 0 :(得分:207)

您必须指定project_id

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

文档here

答案 1 :(得分:1)

当我尝试使用反向生成激活链接并通过电子邮件发送时,这个问题让我非常头疼。所以我认为从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 :(得分:0)

解决也更直接

from django.urls import resolve

resolve('edit_project', project_id=4)

Documentation on this shortcut

答案 3 :(得分:0)

@ miki725解决方案绝对正确。另外,如果您想使用args而不是kwargs属性,则可以按如下所示简单地修改代码:

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

可以在documentation中找到一个示例。这本质上是做同样的事情,但是属性作为参数传递。请记住,传递的所有参数在反转之前都需要分配一个值。只需使用正确的名称空间即可,在本例中为'edit_project'