未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。
我究竟做错了什么?
我可以想到的三件事情是从我的头顶开始的:
- 只是使用命名的url ,它更强大和可维护无论如何
-
尝试在命令行使用
django.core.urlresolvers.reverse
(可能)更好的错误>>> from django.core.urlresolvers import reverse >>> reverse('products.views.filter_by_led')
-
检查是否有多个指向该视图的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 %}