Python Django反向url,模板中带有可选参数

Python Django反向url,模板中带有可选参数,python,django,django-urls,Python,Django,Django Urls,在我的django项目中,我有一个简单的url url(r'^report/(?P<slug>[\w-]+)/$', views.Report.as_view(), name='report') url(r'^report/(?P[\w-]+)/$),views.report.as_view(),name='report') 我已将此特定url放置在应用程序url文件的底部。slug字段是可选参数,可以作为请求的一部分提供,也可以不提供 现在,在一个模板中,当我使用以下语法引用此

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

url(r'^report/(?P<slug>[\w-]+)/$', views.Report.as_view(), name='report')
url(r'^report/(?P[\w-]+)/$),views.report.as_view(),name='report')
我已将此特定url放置在应用程序url文件的底部。slug字段是可选参数,可以作为请求的一部分提供,也可以不提供


现在,在一个模板中,当我使用以下语法引用此url时,
{%url'appname:report“%}
我得到一个NoReverseMatch found错误。我在另一个应用程序中尝试了同样的方法,效果很好。有人能指出这种行为的可能原因吗?我知道我可以有两个单独的URL,但如果可以使用一个URL,我会更喜欢它。

你不需要提及应用程序名称。 命名URL用于在不同的应用程序之间区分URL。 试一试


您将收到错误,因为slug
slug
是正则表达式中的必需组

r'^report/(?P<slug>[\w-]+)/$
就我个人而言,我发现在url.py中有两个条目更清晰

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

明白你的意思了,谢谢。我同意你的第二个建议,从长远来看,它似乎更清晰、更好。谢谢。这两个URL的另一个优点是,它迫使你记住,视图需要在不使用slug的情况下运行。如果在不同的应用程序中有两个同名的URL呢?我想这行不通。另外,使用app name可以让我清楚地知道我指的是哪个app url。你不能在不同的app中使用相同的名称。这就是应用程序名称的区别。我可以有两个应用程序A和B,在A的url中,我可以有一个在B中命名为dashboard的url。在A中引用dashboard时,我所要做的就是
{%url'A:dashboard%}
@RajeshYogeshwar:谢谢你指出,我刚刚浏览了文档,你说得对
r'^report/(?:(?P<slug>[\w-]+)?)/$
url(r'^report/(?P<slug>[\w-]+)/$', views.Report.as_view(), name='report')
url(r'^report/$', views.Report.as_view(), name='report')