渲染时捕获异常:
使用参数'()'和'反转'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。
我做错了什么?
答案 0 :(得分:53)
我能想到的有三件事情在我的头脑中:
尝试在命令行中使用django.core.urlresolvers.reverse
以获得(可能)更好的错误
>>> from django.core.urlresolvers import reverse
>>> reverse('products.views.filter_by_led')
检查您是否有多个指向该视图的网址
答案 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)
如果它对某人有帮助,我遇到了类似的问题,错误是由于两个原因:
在网址名称
之前未使用应用程序的命名空间{% url 'app_name:url_name' %}
网址名称周围缺少单引号(Charlie指出here)
答案 5 :(得分:1)
{% url 'polls:create' poll.id %}
答案 6 :(得分:0)