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

时间:2016-01-04 00:16:26

标签: python regex django django-urls

我现在开始使用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')

因此,换句话说,如果网址的结尾如下所示,例如:

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

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

question_by_date(request, **kwargs)

因此,使用上述网址,question_by_date将被称为

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

但我也希望用户能够输入指定年份的网址,例如

...bydate/year=2005/

将调用

question_by_date(request, year=2005)

或者就此而言,年,月,日的任何组合(如年和月,或仅年和日等)

那么,这可能吗?我在正则表达式方面不是很有经验,而且我知道你可以在正则表达式中有可选的字符串匹配(零或更多),这在正常情况下会匹配以上就好了,但是这里我们也将(可选)参数传递给函数。

注:

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

1 个答案:

答案 0 :(得分:4)

我认为你需要的是GET参数:

  1. 定义您没有任何参数的网址:

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

  2. 在您的观看中,提取GET参数:

  3. 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. 将您的网址称为:

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

    2. 检查django doc以获取有关http GET的详细信息。