【问题标题】:Reverse for '*' with arguments '()' and keyword arguments '{}' not found未找到带有参数“()”和关键字参数“{}”的“*”的反向
【发布时间】:2010-12-22 23:29:52
【问题描述】:

渲染时遇到异常:

“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。

我做错了什么?

【问题讨论】:

  • 你能同时显示 lcd_screen_size 和 filter_by_led url 定义吗?
  • 因为反向在 shell 中工作......这可能是导致问题的其他原因。我遇到了一些非常奇怪的反向错误,看起来你项目中任何错误的 url 定义都会把整个事情搞砸:/

标签: python django django-templates


【解决方案1】:

我能想到三件事:

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

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

【讨论】:

  • reverse 在 shell 中似乎可以正常工作: >>> from django.core.urlresolvers import reverse >>> reverse('products.views.filter_by_led') '/reviews/led/'跨度>
  • 我也尝试使用名称 url,但我得到了相同类型的错误:渲染时捕获异常:使用参数 '()' 和关键字参数 '{}' 反转'ledtvfilter'。
  • 如果在 shell 中反向工作,那么这可能不是导致错误的原因
  • 命名的 url 也满足了我的目的 :)
  • @Jiaaro 我们也可以添加数字 4) url、views 和 reverse 可能没问题,但如果 html 有一个错误的{% url %},那么我们也会得到这个错误
【解决方案2】:

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

  1. 在 url 名称之前不使用应用的命名空间

    {% url 'app_name:url_name' %}
    
  2. url 名称周围缺少单引号(正如 Charlie 指出的 here

【讨论】:

    【解决方案3】:
    {% url 'polls:create' poll.id %}
    

    【讨论】:

      【解决方案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')
      ]
      

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

      【讨论】:

      • 非常感谢。花了一个小时调试问题。您的解决方案正是我所缺少的。
      【解决方案5】:

      您需要在视图名称周围加上单引号

      {% url 'viewname' %}
      

      而不是

      {% url viewname %}
      

      【讨论】:

      • 这很有帮助!
      【解决方案6】:

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

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

      是的,这是合乎逻辑的。是的,它也令人困惑,因为 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 与正则表达式(预期的数字,提供的字符串)不匹配。

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

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

      说到 url 模板标签,有一些有趣的地方。 Django documentation 给出了使用引用视图名称的示例:

      {% url 'news.views.year_archive' 年份变量 %}

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

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

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

      使用参数反转“show_cookies”...

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

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

      而这令人困惑的。

      【讨论】:

      • 我使用了一个 url (r'^candidate-verifymobile/$, views.VerifyMobile.as_view(), name='verify-mobile'),但是当我使用反向时它仍然给出同样的错误在这种情况下,我在 url 中没有任何关键字参数。
      • 在某些情况下,有时我会有一个参数,而有时我不会,我是否需要在我的 urls.py 中创建两个单独的视图函数和两个单独的 url ?使用您的示例想象有时u.pk 是一个数字,有时它是无。但在您的模板中,您使用的是{% url 'show_cookies' url_id=u.pk %}。我尝试添加 {% if u.pk == None %} show error message {%else%} {% url 'show_cookies' url_id=u.pk %} {%endif%} 但我仍然收到 NoReverseMatch 异常。
      • www.dupa.com _________
      • 7 年来,我希望有人终于注意到了? ?
      【解决方案7】:

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

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

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

      【讨论】:

      • 没关系,但如果你想在 url 中有一个斜杠,它应该在那里(我所有的 urls.py 文件都有斜杠)
      猜你喜欢
      • 2013-12-07
      • 2015-08-29
      • 2014-05-29
      • 2013-07-25
      • 2019-11-06
      • 2012-07-08
      • 2019-04-21
      • 2016-06-15
      相关资源
      最近更新 更多