未find参数'()'和关键字参数'{}'的'*'

在呈现时捕获exception:

未find参数'()'和关键字参数'{}'的'products.views.'filter_by_led'反向。

我能够成功地从shell导入products.views.filter_by_led ,它的工作原理是这样的path应该是正确的。

这里是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会认为这个函数不能find该函数的Reverse。

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

我究竟做错了什么?

我可以想到的三件事情是从我的头顶开始的:

  1. 只是使用命名的url ,它更强大和可维护无论如何
  2. 尝试在命令行使用django.core.urlresolvers.reverse (可能)更好的错误

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

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

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

是的,这是合乎逻辑的。 是的,这也是令人困惑的,因为反向只会抛出exception,不会给你任何进一步的提示。

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不匹配正则expression式(预期的数字,提供的string)。

您可以对位置参数和关键字参数使用反转 。 语法是:

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

至于url模板标签,有一些有趣的事情。 Django 文档给出了使用带引号的视图名称的例子:

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

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

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

但这不适合我。 但是exception消息给了我一些什么可能是错误的提示 – 请注意视图名称周围的双引号:

反向“show_cookies”与参数…

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

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

令人困惑的。

视图名称周围需要单引号

 {% url 'viewname' %} 

代替

 {% url viewname %} 

我有一个类似的问题,解决scheme是正确使用'$'(string结束)字符:

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

注意第二个url的变化! 我的card_purchases应用程序的url.py如下所示:

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

除此之外,我可以确认名称url的引用是至关​​重要的!

我不认为你需要在URL条目后面的斜杠。 即,把这个,而不是:

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

这是假定你已经启用了尾部斜杠 ,这是默认的。

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