我现在开始使用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年前问过这个问题。希望在此期间进行了一些改进?
答案 0 :(得分:4)
我认为你需要的是GET
参数:
定义您没有任何参数的网址:
url(r'^bydate/$', views.question_by_date, name='question-by-date')
在您的观看中,提取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
将您的网址称为:
检查django doc以获取有关http GET
的详细信息。