首页 文章

使用参数'()'和'{}'找不到关联参数'*'

提问于
浏览
57

渲染时捕获异常:

使用参数'()'和关键字参数'{}'找不到'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 回答

  • 35

    我能想到的有三件事情:

    • 刚刚使用了named urls,无论如何它更加强大和可维护

    • 尝试在命令行使用 django.core.urlresolvers.reverse 以获得(可能)更好的错误

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

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

    • must 提供与视图需要的任何参数匹配的参数,

    • 这些 arguments 必须与正则表达式匹配 .

    是的,它也是令人困惑的,因为反向只会抛出异常并且不会给你任何进一步的提示 .

    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模板标签,有趣的是它 . 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%}

    而这个令人困惑 .

  • 1

    您需要围绕视图名称使用单引号

    {% url 'viewname' %}
    

    代替

    {% url viewname %}
    
  • 0

    我有一个类似的问题,解决方案正确使用'$'(字符串结尾)字符:

    我的主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')
    ]
    

    I used the '$' twice. 所以一个简单的改变是有效的:

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

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

  • 52

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

    • 在网址名称前未使用应用程序的命名空间
    {% url 'app_name:url_name' %}
    
    • 网址名称周围缺少单引号(由查理指出here
  • 4

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

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

    假设您已启用trailing slashes,这是默认设置 .

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

相关问题