Django - URL 中的正则表达式可选函数参数

Django - regex optional function parameters in URL

我现在开始使用 Django(已经有相当多的 Python 知识,以及其他语言)。我想知道是否可以通过 url 将可选参数传递给视图(输入某个 url 时调用的函数)。我有:

url(regex=r'^bydate/year=(?P<year>[0-9]+)_month=(?P<month>[0-9]+)_day=(?P<day>[0-9]+)/$', view=views.question_by_date, name='question_by_date')

所以,换句话说,如果 url 的结尾看起来像这样,例如:

...bydate/year=2001_month=11_day=2/

然后调用question_by_date函数,函数签名如下:

question_by_date(request, **kwargs)

所以上面的url,question_by_date会被称为

question_by_date(request, year=2001, month=11, day=2)

但我也希望用户能够输入 url 仅指定年份,例如

...bydate/year=2005/

哪个会调用

question_by_date(request, year=2005)

或者就此而言,年、月、日的任意组合(例如只是年和月,或者只是年和日,等等)

那么,这可能吗?我在正则表达式方面经验不足,我知道你可以在正则表达式中有可选的字符串匹配(零个或多个),这在正常情况下会匹配上面的内容,但在这里我们也将(可选)参数传递给函数.

注意:

已经有人问过一个与此非常相似的问题 here。我意识到我可以为每个组合制作不同的 URL,但这需要制作 8 个不同的 URL。另外,这个问题是 6 年前提出的。希望在此期间进行了一些改进?

我想你需要的是GET参数:

  1. 定义你url不带任何参数:

    url(r'^bydate/$', views.question_by_date, name='question-by-date')

  2. 在您看来,提取GET个参数:

from datetime import date

def question_by_date(request):
    year = request.GET.get('year', 2005)
    month = request.GET.get('month', 1)
    day = request.GET.get('day', 1)
    # use the parameters however you want afterwards
  1. 给你的url打电话:

    http://localhost:8000/bydate/?year=2016&month=1&day=1

查看 django doc 了解有关 http GET 的更多详细信息。