在Django中的urls.py上参数化日期

时间:2013-11-17 23:24:38

标签: python regex django

我有以下网址定义:

url(r'^date-add/(?P<entity_id>\d+)$', views.date_add, name='date_add'),

这允许我使用以下URL调用date_add函数:

/app_name/date-add/<id>

我想解决这个问题,以便约会。例如:

/app_name/date-add/1/2013-04-23

如何编辑我的urls.py定义才能实现此目的?

2 个答案:

答案 0 :(得分:2)

您可以像这样定义URL正则表达式:

url(r'^date-add/(?P<entity_id>\d+)/(?P<date>\d{4}-\d{2}-\d{2})/$', views.date_add, name='date_add'),

和视图,显然是

def date_add(request, entity_id, date):
    #convert to datetime object from string here. 

答案 1 :(得分:1)

通常,您将其分解为与年,月和日相对应的命名参数:

url(r'^date-add/(?P<entity_id>\d+)/(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})/$', views.date_add, name='date_add_with_param'),

然后,您可以使用datetime.date在视图中构建日期时间,该日期时间应接收yearmonthday作为参数。

这是典型的模式,特别是对于存档视图,在您向下钻取时URL可能会更具体 - / archive / 2013 /和/ archive / 2013/11 /可能都是有效的,尽管当然您可能不会也没有一个正则表达式匹配。与单个命名模式regexp karthikr的答案显示相比,它可能会不必要地复杂,然后您可以使用datetime.strptime进行解析。

在任何一种情况下,如果你愿意,你也可以使用一些限制性更强的正则表达式,比如那些月内不允许使用0,1,2或3以外的第一个数字的正则数。