Django reverse url 在模板中使用可选参数

Django reverse url with optional arguments in template

在我的 django 项目中,我有一个简单的 url

url(r'^report/(?P<slug>[\w-]+)/$', views.Report.as_view(), name='report')

我已将这个特定的 url 放在应用程序 url 文件的底部。 slug 字段是一个可选参数,它可能会或可能不会作为请求的一部分提供。

现在,在模板中,当我使用此语法 {% url 'appname:report' %} 引用此 url 时,我收到 NoReverseMatch found 错误。我在另一个应用程序中尝试过同样的事情,它工作正常。任何人都可以指出这种行为的可能原因吗?我知道我可以有两个单独的 url,但如果可以用一个来完成,我会更喜欢它。

您无需提及应用名称。 命名 url 用于在不同的应用程序之间区分 url。 尝试

{% url 'report' %}

您收到错误消息是因为 slug 是您的正则表达式中的必需组。

r'^report/(?P<slug>[\w-]+)/$

我相信您可以通过将 slug 包装在非捕获组中并使其成为可选来使其工作。

r'^report/(?:(?P<slug>[\w-]+)?)/$

就个人而言,我发现在 urls.py 中有两个条目更清楚。

url(r'^report/(?P<slug>[\w-]+)/$', views.Report.as_view(), name='report')
url(r'^report/$', views.Report.as_view(), name='report')