【问题标题】:How to define multiple optional variables in the URL?如何在 URL 中定义多个可选变量?
【发布时间】:2014-01-11 19:27:32
【问题描述】:

在 django doc 中建议使用 urlpatterns 代替 GET 方法,并以方便的方式处理这些变量。但如果至少有一个变量不是必需的,我将不得不在 url.py 中编写更多行。我喜欢我可以避免这种情况?

示例: 如果我想在给定年份抽取帖子样本,在 urlpatterns 中我应该添加如下内容:

url(r'^articles/(?P<year>\d{4})/$', 'news.views.show_archive'),

网址:.../articles/1994/

如果我想将特定月份的样本位置设为特定年份,在 urlpatterns 中我应该添加如下内容:

url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.show_archive'),

网址:.../articles/2003/03/

但如果我想查看创建特定月份的所有年份的记录,我还必须添加这一行:

url(r'^articles/(?P<month>\d{2})/$', 'news.views.show_archive'),

网址:.../articles/03/

但我只想做一行来指定最大变量集,但这会处理这些 URL 中的任何一个。 老实说,我不确定这是否可行。

【问题讨论】:

  • 你能提供你的代码示例吗?
  • 您总是可以实现自定义路由器。

标签: python django django-urls


【解决方案1】:

正则表达式可以有可选部分,视图函数可以有可选参数。此外,您仍然可以将查询字符串(通过 request.GET)用于 URL 中没有业务的内容(例如“搜索”视图的查询词、列表视图的排序和过滤等)。

使用 urlpatterns 而不是查询字符串的目的是构建干净的“语义”url,即/blog/posts/&lt;post_id&gt;/ 而不是/blog/posts/?post_id=&lt;post_id&gt;

【讨论】:

  • 我在正则表达式中“不好”。如何指定某个部分是可选的?
【解决方案2】:

你可以这样试试

url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.show_archive'),


def show_archive(request,year=None,month=None):
    if year and month:
       .....................
    elif year:
       .....................
    elif month:
        ....................

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 2022-12-18
    • 2018-07-13
    • 1970-01-01
    • 2016-06-03
    • 2013-05-12
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多