Django可选url参数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (89)

我有一个像这样的Django url:

url(
    r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
    'tool.views.ProjectConfig',
    name='project_config'
),

我的看法:

def ProjectConfig(request, product, project_id=None, template_name='project.html'):
    ...
    # do stuff

问题是我想要这个项目_ID参数为可选参数。我想那样/project_config//project_config/12345abdce/都是同样有效的url模式,因此如果project_id我就可以用它了。目前,如果我尝试访问url而不使用project_id参数。

提问于
用户回答回答于

有几种方法。

一种是使用一种奇特的正则表达式..。(?:/(?P<title>[a-zA-Z]+)/)?

另一个更容易遵循的方法是拥有多个符合您的需要的规则,所有这些规则都指向相同的视图。

urlpatterns = patterns('',
    url(r'^project_config/$', views.foo),
    url(r'^project_config/(?P<product>\w+)/$', views.foo),
    ulr(r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', views.foo),
)

请记住,在视图中,还需要为可选的URL参数设置默认设置,否则会得到一个错误:

def foo(request, optional_parameter=''):
    # Your code goes here
用户回答回答于

Django<1.8

urlpatterns = patterns(''
    url(r'^project_config/', include(patterns('',
        url(r'^$', ProjectConfigView.as_view(), name="project_config")
        url(r'^(?P<product>\w+)$', include(patterns('',
            url(r'^$', ProductView.as_view(), name="product"),
            url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
        ))),
    ))),
)

Django>=1.8

urlpatterns = [
    url(r'^project_config/', include([
        url(r'^$', ProjectConfigView.as_view(), name="project_config")
        url(r'^(?P<product>\w+)$', include([
            url(r'^$', ProductView.as_view(), name="product"),
            url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
        ])),
    ])),
]

扫码关注云+社区