我有一个这样的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_config/
和/project_config/12345abdce/
是同样有效的网址模式,这样如果传递了 project_id
,然后I就可以使用它了。
就目前而言,当我访问不带project_id
参数的URL时,我得到了一个404。
发布于 2013-01-16 12:03:11
有几种方法。
一种是在正则表达式中使用非捕获组:(?:/(?P<title>[a-zA-Z]+)/)?
Making a Regex Django URL Token Optional
另一种更容易遵循的方法是让多个规则符合您的需求,所有规则都指向相同的视图。
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
发布于 2019-01-24 22:13:38
Django > 2.0版本
该方法与Yuji 'Tomita' Tomita's Answer中给出的方法基本相同。但是,受影响的是语法:
# URLconf
...
urlpatterns = [
path(
'project_config/<product>/',
views.get_product,
name='project_config'
),
path(
'project_config/<product>/<project_id>/',
views.get_product,
name='project_config'
),
]
# View (in views.py)
def get_product(request, product, project_id='None'):
# Output the appropriate product
...
使用path()
,您还可以使用类型为dict
的可选参数kwargs
进行pass extra arguments to a view。在这种情况下,您的视图将不需要project_id
属性的默认值
...
path(
'project_config/<product>/',
views.get_product,
kwargs={'project_id': None},
name='project_config'
),
...
有关如何在最新的Django版本__中执行此操作的信息,请参阅。
发布于 2014-03-25 06:51:25
您可以使用嵌套路由
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")
])),
])),
]
这要简单得多(假设您想将product
kwarg重命名为product_id
,您只需更改第4行,它将影响以下URL。
为Django 1.8及更高版本编辑
https://stackoverflow.com/questions/14351048
复制相似问题