使用参数'()'和未找到关键字参数'{}'来反转'*'

Bry*_*ock 60 python django django-templates

渲染时捕获异常:

使用参数'()'和关键字参数'{}'找不到'products.views.'filter_by_led'的反转.

我能够成功地products.views.filter_by_led从shell 导入,它工作,所以路径应该是正确的.

这是urls.py:

(r'^led-tv/$', filter_by_led ),
Run Code Online (Sandbox Code Playgroud)

这是生成错误的地方:

href="{% url products.views.filter_by_led %}">
Run Code Online (Sandbox Code Playgroud)

我无法理解,因为这可以从同一个文件中正常工作:

{% url products.views.lcd_screen_size screen_size=50 %}
Run Code Online (Sandbox Code Playgroud)

这是函数定义:

def filter_by_led(request):
Run Code Online (Sandbox Code Playgroud)

我不明白为什么Django会认为该函数无法找到该函数的Reverse.

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

我究竟做错了什么?

Jia*_*aro 54

我能想到的有三件事:

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

    >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
    Run Code Online (Sandbox Code Playgroud)
  3. 检查您是否有多个指向该视图的网址

  • +1为多个具有相同名称的网址 (2认同)
  • @Jiaaro我们也可以添加数字4)url、视图和反向可能没问题,但如果html有一个错误的`{% url %}`,那么我们也会得到这个错误 (2认同)

kra*_*etz 37

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

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

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

URL模式的示例:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),
Run Code Online (Sandbox Code Playgroud)

然后在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.
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为我没有提供任何参数.

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'
Run Code Online (Sandbox Code Playgroud)

现在它奏效了,但......

>>> 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.
Run Code Online (Sandbox Code Playgroud)

现在它不起作用,因为url_id与regexp(预期的数字,提供的字符串)不匹配.

您可以对位置参数和关键字参数使用reverse.语法是:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)
Run Code Online (Sandbox Code Playgroud)

关于url模板标签,有趣的是它.Django 文档给出了使用引用视图名称的示例:

{%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%}

令人困惑的.

  • www.dupa.com _________ (2认同)

Cha*_*lie 11

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

{% url 'viewname' %}
Run Code Online (Sandbox Code Playgroud)

代替

{% url viewname %}
Run Code Online (Sandbox Code Playgroud)