【问题标题】:django template throws NoReverseMatch errordjango 模板抛出 NoReverseMatch 错误
【发布时间】:2013-09-27 22:40:53
【问题描述】:

我在视图中有两个方法 create 和 update,其中 update 接受一个参数,而 create 不接受任何参数。我决定把它们变成只有一个函数 update_create 因为它们并没有那么不同。

这是视图中的新方法的外观:

  def update_create(request, id=None):

这是我的 urls.py:

  url(r'^(\d+)/update/$|create/$', update_create, name='update_create'),

这就是我的模板在 templates/list.html 中的样子

  <a href="{% url 'update_create' %}"> Create a new event </a>

我在使用上面的代码时遇到了这个错误:

  NoReverseMatch at /agenda/list/
  Reverse for 'update_create' with arguments '()' and keyword arguments '{}' not found.

但是,如果我在模板中使用它(我添加了一个参数),它可以正常工作:

  <a href="{% url 'update_create' 1 %}"> Create a new event </a>

有人可以解释发生了什么吗?为什么以前的代码不起作用,为什么新代码起作用?

【问题讨论】:

标签: django django-templates django-views


【解决方案1】:

URL 模式 (\d+) 期望数字作为参数提供。要解决此问题,只需提供如下网址:

url(r'^(\d+)/update/$', update_create, name='update_create'),
url(r'^update/$', update_create, name='update_create'),

【讨论】:

  • 已修复,我只是稍微修改一下 urls.py 以使参数可选: url(r'^(\d+)?/?update/$|create/$', update_create, name= 'update_create'),现在它可以工作了。谢谢你:)
  • @smarber - 我建议您采用 mariodev 的方法 - 有两个单独的 URL 以保持明确。这更具可读性,并且易于调试。
  • 我只是想尽可能避免冗长,但这不应该使调试变得更加困难。我明白你的意思了,谢谢你的建议
【解决方案2】:

正如 mariodev 指出的那样,您的 url 模式期望 url 前面有一个数字。因此,您的第一个网址:

<a href="{% url 'update_create' %}"> Create a new event </a>

会生成一个类似 /update 的 url,它不是一个有效的 url。但是,后一个网址:

<a href="{% url 'update_create' 1 %}"> Create a new event </a>

会生成一个类似 /1/update 的 url,它是一个有效的 url。

来自 django 文档:https://docs.djangoproject.com/en/dev/topics/http/urls/

基本上,后续参数会在先到先得的情况下进行解析,然后传递给您的视图。开发时要考虑的另一件事是使用显式命名的参数,正如 django 文档所详述的那样。

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2023-03-26
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多