2

我在视图中有两个方法 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>

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

4

2 回答 2

2

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

url(r'^(\d+)/update/$', update_create, name='update_create'),
url(r'^update/$', update_create, name='update_create'),
于 2013-09-27T22:55:49.767 回答
1

正如 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-09-27T23:23:06.603 回答