使用参数'()'和未找到关键字参数'{}'来反转'*'

时间:2009-12-03 19:42:14

标签: python django django-templates

渲染时捕获异常:

  

使用参数'()'和'反转'products.views.'filter_by_led'   找不到关键字参数“{}”。

我能够从shell成功导入products.views.filter_by_led并且它有效,所以路径应该是正确的。

这是urls.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会认为该函数无法找到该函数的Reverse。

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

我做错了什么?

7 个答案:

答案 0 :(得分:53)

我能想到的有三件事情在我的头脑中:

  1. 刚刚使用named urls,无论如何它都更强大和可维护
  2. 尝试在命令行中使用django.core.urlresolvers.reverse以获得(可能)更好的错误

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

答案 1 :(得分:36)

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

  • 必须提供与视图所需的任何参数匹配的参数
  • 这些参数必须与正则表达式匹配。

是的,这是合乎逻辑的。是的,它也令人困惑,因为 reverse 只会抛出异常并且不会给你任何进一步的提示。

网址格式示例:

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 模板标签,有趣的是它。 Django documentation给出了使用引用视图名称的示例:

  

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

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

  

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

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

  

使用参数反转''show_cookies''...

当我删除引号时,它开始起作用了:

  

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

令人困惑。

答案 2 :(得分:11)

视图名称

周围需要单引号
{% url 'viewname' %}

而不是

{% url viewname %}

答案 3 :(得分:4)

我遇到了类似的问题,解决方案是正确使用'$'(字符串结尾)字符:

我的主要url.py看起来像这样(注意$字符):

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^$', include('card_purchase.urls' )),
]

我的card_purchases应用程序的url.py说:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

我曾两次使用'$'。所以一个简单的改变是有效的:

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^cp/', include('card_purchase.urls' )),
]

注意第二个网址的变化!我的card_purchases应用的url.py看起来像这样:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

除此之外,我可以确认名称网址周围的引号至关重要!

答案 4 :(得分:2)

如果它对某人有帮助,我遇到了类似的问题,错误是由于两个原因:

  1. 在网址名称

    之前未使用应用程序的命名空间
    {% url 'app_name:url_name' %}
    
  2. 网址名称周围缺少单引号(Charlie指出here

答案 5 :(得分:1)

{% url 'polls:create' poll.id %}

答案 6 :(得分:0)

我认为您不需要URL条目中的尾部斜杠。即,改为:

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

假设您启用了trailing slashes,这是默认设置。