找不到带参数“()”和关键字参数“{}”的“*”的反转

2024-03-29 09:55:38 发布

您现在位置:Python中文网/ 问答频道 /正文

呈现时捕获到异常:

Reverse for 'products.views.'filter_by_led' with arguments '()' and keyword arguments '{}' not found.

我成功地从shell导入了products.views.filter_by_led,它工作正常,所以路径应该是正确的。

以下是url.py:

(r'^led-tv/$', filter_by_led ),

这就是产生错误的地方:

href="{% url products.views.filter_by_led %}">

我无法理解,因为这在同一个文件中运行良好:

{% url products.views.lcd_screen_size screen_size=50 %}

下面是函数定义:

def filter_by_led(request):

我不明白为什么Django会认为函数找不到该函数的相反方向。

我删除了所有*.pyc文件并重新启动了Apache。

我做错什么了?


Tags: and文件函数urlforsizebyled
3条回答

视图名称周围需要单引号

{% url 'viewname' %}

而不是

{% url viewname %}

有三件事我可以从头想到:

  1. 刚用过named urls,它更健壮,也更易于维护
  2. 尝试在命令行使用django.core.urlresolvers.reverse以获得(可能)更好的错误

    >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
  3. 检查是否有多个指向该视图的url

reverse的Shell调用(如上所述)非常适合调试这些问题,但有两个关键条件:

  • 必须提供与视图需要的任何参数匹配的参数
  • 这些参数必须与regexp模式匹配。

是的,这是合乎逻辑的。是的,这也很混乱,因为reverse只会抛出异常,不会给您任何进一步的提示。

URL模式示例:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),

然后在shell中发生了什么:

>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.

它不起作用,因为我没有提供任何参数。

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'

现在成功了,但是。。。

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.

现在它不工作了,因为url_id与regexp(预期为数字,提供了字符串)不匹配。

您可以将reverse与位置参数和关键字参数一起使用。语法为:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)

当谈到url模板标记时,有一点很有趣。Djangodocumentation给出了使用带引号的视图名称的示例:

{% url 'news.views.year_archive' yearvar %}

所以我在我的HTML模板中以类似的方式使用了它:

{% url 'show_cookies' hostname=u.hostname url_id=u.pk %}

但这对我不起作用。但异常消息给了我一个可能出错的提示-请注意视图名称周围的双引号:

Reverse for ''show_cookies'' with arguments...

当我删除引号时,它开始工作:

{% url show_cookies hostname=u.hostname url_id=u.pk %}

这让人很困惑。

相关问题 更多 >