未找到参数“()”和关键字参数“{}”的 Django 反转

你好,我有个恼人的问题。

我有一个这样的网址模式:

# 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.

我错过了什么?

150978 次浏览

你必须指定 project_id:

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

给你医生

这个问题给我很大的头痛时,我试图使用反向生成激活链接,并通过电子邮件发送它当然。所以我觉得从测试结果来看,应该是一样的。 做到这一点的正确方法如下:

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

函数 resolve_url也更直观

from django.shortcuts import resolve_url


resolve_url('edit_project', project_id=4)

关于此快捷方式的文档

这个解决方案@miki725是绝对正确的。或者,如果您想使用 args属性而不是 kwargs属性,那么您可以简单地修改您的代码如下:

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

这方面的一个例子可以在 文件中找到。这实际上是做同样的事情,但是属性作为参数传递。请记住,传递的任何参数都需要在被反转之前赋值。只需使用正确的名称空间,在本例中为 'edit_project'

最简单的方法是使用具有 reverse()功能的 kwargs:

from django.test import Client
from django.urls import reverse


url = reverse("edit_project", kwargs={"project_id": 4})
response = Client().get(url)