我有一个像这样的Django URL:
url( r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', 'tool.views.ProjectConfig', name='project_config' ),
views.py:
def ProjectConfig(request, product, project_id=None, template_name='project.html'): ... # do stuff
问题是我希望project_id参数是可选的。
project_id
我希望/project_config/并且/project_config/12345abdce/成为同等有效的URL模式,以便如果 project_id通过,那么我可以使用它。
/project_config/
/project_config/12345abdce/
就目前而言,访问不带project_id参数的URL时会得到404 。
有几种方法。
一种是在正则表达式中使用非捕获组:使正则 (?:/(?P<title>[a-zA-Z]+)/)? 表达式Django URL令牌为可选
(?:/(?P<title>[a-zA-Z]+)/)?
另一种更容易遵循的方法是拥有多个符合你需求的规则,所有规则都指向同一视图。
urlpatterns = patterns('', url(r'^project_config/$', views.foo), url(r'^project_config/(?P<product>\w+)/$', views.foo), url(r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', views.foo), )
请记住,在你的视图中,你还需要为可选的URL参数设置默认值,否则会出现错误:
def foo(request, optional_parameter=''): # Your code goes here