Django反向解析未找到参数为'()'和关键字参数为'{}'的视图

189

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

我有一个像这样的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.

我在这里缺少什么?


1
在最新的Django中,reverse是从urls导入的。即from django.urls import reverse - suhailvs
5个回答

366

您必须指定project_id

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

文档在这里


1
你能否也包括如何在模板中实现这个功能? - Gershom Maes
1
docs有示例。 - miki725
1
干得漂亮! - Muhammad Haseeb

26

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

@miki725的解决方案是绝对正确的。或者,如果您想使用args属性而不是kwargs,那么只需按以下方式修改代码即可:

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

这方面的一个例子可以在文档中找到。实质上,它做了同样的事情,但属性是作为参数传递的。请记住,在反向时需要给传递的任何参数分配一个值。只需使用正确的名称空间,即此情况下的'edit_project'即可。


1
我喜欢它的简洁。 - Bartleby

4

当我尝试使用反向生成激活链接并通过电子邮件发送时,这个问题让我非常头疼。所以我认为从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
我刚试了一下,它不起作用。@miki725的答案是正确的。 - Daniel van Flymen
1
我认为一个大括号放错了位置:response = client.get(reverse('edit_project', project_id=4))。 - Wim Feijen

3
最简单的方法是使用 reverse() 函数和 kwargs
from django.test import Client
from django.urls import reverse

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

2
函数resolve_url也更加直观。
from django.shortcuts import resolve_url

resolve_url('edit_project', project_id=4)

此快捷方式的文档


尊敬的,我尝试了但对我无效。我将坚持使用反向方法。2018 Django 2。 - Kermit
@SebCorbin,你真的不理解resolve函数。它的第一个参数是路径而不是URL名称。 - Wariored
1
@Wariored 谢谢您的评论,我注意到我引用了错误的函数,而且它似乎没有在官方文档中记录,只有在源代码中。已编辑以修复此问题。 - SebCorbin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接