首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django可选url参数

Django可选url参数
EN

Stack Overflow用户
提问于 2013-01-16 11:46:36
回答 7查看 160.2K关注 0票数 199

我有一个这样的Django URL:

代码语言:javascript
复制
url(
    r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
    'tool.views.ProjectConfig',
    name='project_config'
),

views.py:

代码语言:javascript
复制
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。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-01-16 12:03:11

有几种方法。

一种是在正则表达式中使用非捕获组:(?:/(?P<title>[a-zA-Z]+)/)?

Making a Regex Django URL Token Optional

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

代码语言:javascript
复制
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参数设置默认值,否则会得到一个错误:

代码语言:javascript
复制
def foo(request, optional_parameter=''):
    # Your code goes here
票数 433
EN

Stack Overflow用户

发布于 2019-01-24 22:13:38

Django > 2.0版本

该方法与Yuji 'Tomita' Tomita's Answer中给出的方法基本相同。但是,受影响的是语法:

代码语言:javascript
复制
# 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属性的默认值

代码语言:javascript
复制
    ...
    path(
        'project_config/<product>/',
        views.get_product,
        kwargs={'project_id': None},
        name='project_config'
    ),
    ...

有关如何在最新的Django版本__中执行此操作的信息,请参阅。

票数 39
EN

Stack Overflow用户

发布于 2014-03-25 06:51:25

您可以使用嵌套路由

Django <1.8

代码语言:javascript
复制
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

代码语言:javascript
复制
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及更高版本编辑

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14351048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档