我有一个这样的 Django URL:
url( r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', 'tool.views.ProjectConfig', name='project_config' ),
视图.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]+)/)?
(?:/(?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