Python 如何从url到视图仅传递年份
我有我的django应用程序,我想通过url查看年份的格式,例如:2017-18。 下面我得到一个错误,我的日期必须是日期格式-YYYY-MM-DD 这是我的网址:Python 如何从url到视图仅传递年份,python,regex,django,url,view,Python,Regex,Django,Url,View,我有我的django应用程序,我想通过url查看年份的格式,例如:2017-18。 下面我得到一个错误,我的日期必须是日期格式-YYYY-MM-DD 这是我的网址: url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{2})$', Events.as_view()), 事件对象的开始和结束属性可能是datetime.date实例(如果您使用的是DateField)。因此
url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{2})$', Events.as_view()),
事件对象的开始和结束属性可能是datetime.date实例(如果您使用的是DateField)。因此,在视图中使用year1和year2变量之前,需要将它们从url转换为日期
some_date = datetime.date(YYYY, 1, 1)
事件对象的开始和结束属性可能是datetime.date实例(如果您使用的是DateField)。因此,在视图中使用year1和year2变量之前,需要将它们从url转换为日期
some_date = datetime.date(YYYY, 1, 1)
您最初的问题和其他人在这里的答案与从
第一年1月1日开始到第二年12月31日结束的一个季节相匹配。我怀疑这不是你想要的,相反,你想要的是一个季节,它在year1
的某个时间开始,在year2
的某个时间结束,然后你想要查找这些日期之间的事件
Django有一个特殊的查找,使用\uu year=
只匹配日期的年份部分。请参阅以了解更多关于此的信息。您不需要将输入值转换为日期来使用它;它适用于整数
def get_queryset(self):
# Get a season starting any time in year1 and ending in year2
season = Events.objects.get(
start__year=int(self.kwargs['year1']),
end__year=int(self.kwargs['year2']),
)
与其他人的评论一样,您应该更改URL正则表达式以匹配4位数的年份,以避免歧义
url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{4})$', Events.as_view()),
url(r'^(?P/production/(?P[0-9]{4})-(P[0-9]{4})$”,Events.as_view(),
你最初的问题和其他人在这里的回答,与一个季节相匹配,这个季节从第一年的1月1日开始,到第二年的12月31日结束。我怀疑这不是你想要的,相反,你想要的是一个在第一年的某个时间开始,在第二年的某个时间结束的季节,然后你想要查找这些日期之间的事件
Django有一个特殊的查找功能,可以使用\uu year=
仅匹配日期的年份部分。有关详细信息,请参阅。使用此功能不需要将输入值转换为日期;它可以处理整数
def get_queryset(self):
# Get a season starting any time in year1 and ending in year2
season = Events.objects.get(
start__year=int(self.kwargs['year1']),
end__year=int(self.kwargs['year2']),
)
与其他人的评论一样,您应该更改URL正则表达式以匹配4位数的年份,以避免歧义
url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{4})$', Events.as_view()),
url(r'^(?P/production/(?P[0-9]{4})-(P[0-9]{4})$”,Events.as_view(),
正如@dentemm所指出的,要对日期时间字段进行过滤,表示日期的字符串必须转换为日期时间对象
。我的建议是,像您已经做的那样传递年份字符串,然后在视图中将日期字符串转换为日期时间对象进行过滤
import datetime
def get_queryset(self):
start=datetime.strptime('1-1-'+self.kwargs['year1'], '%m-%d-%Y')
end=datetime.strptime('12-31-'+self.kwargs['year2'], '%m-%d-%Y')
season = Events.objects.get(start=start, end=end)
filter_['start__gte'] = season.start
filter_['start__lte'] = season.end
return self.model.objects.filter(**filter_)
datetime.strtime('1-1-'+self.kwargs['year1','%m-%d-%Y')
将为给定的开始日期字符串和datetime.strtime('12-31-'+self.kwargs['year2','%m-%d-%Y')创建日期为1月1日的开始日期的datetime对象
将为给定的结束日期字符串的结束日期创建日期为12月31日的datetime对象。要确保通过查询返回在结束日期内创建的所有对象,您可以执行以下操作
`end_date = datetime.strptime('31-12-'+self.kwargs['year1']+'T23:59:59.999999', '%m-%d-%YT%H:%M:%S.%f')`
如@Alasdair在一条注释中所述,将(?p[0-9]{2})更改为(?p[0-9]{4})
要从url接受4位年份字符串,正如@dentemm指出的那样,要对datetime字段进行筛选,表示日期的字符串必须转换为datetime对象
。我的建议是。像您已经做的那样传递年份字符串,然后在视图中将日期字符串转换为datetime对象进行筛选
import datetime
def get_queryset(self):
start=datetime.strptime('1-1-'+self.kwargs['year1'], '%m-%d-%Y')
end=datetime.strptime('12-31-'+self.kwargs['year2'], '%m-%d-%Y')
season = Events.objects.get(start=start, end=end)
filter_['start__gte'] = season.start
filter_['start__lte'] = season.end
return self.model.objects.filter(**filter_)
datetime.strtime('1-1-'+self.kwargs['year1','%m-%d-%Y')
将为给定的开始日期字符串和datetime.strtime('12-31-'+self.kwargs['year2','%m-%d-%Y')创建日期为1月1日的开始日期的datetime对象
将为给定的结束日期字符串的结束日期创建日期为12月31日的datetime对象。要确保通过查询返回在结束日期内创建的所有对象,您可以执行以下操作
`end_date = datetime.strptime('31-12-'+self.kwargs['year1']+'T23:59:59.999999', '%m-%d-%YT%H:%M:%S.%f')`
正如@Alasdair在其中一条注释中所述,将(?p[0-9]{2})更改为(?p[0-9]{4})
要接受url中的4位年份字符串,请使用Django中的年份查找:
正如它所说:
Entry.objects.filter(发布日期=2005年)
在sql中等于:
选择…其中发布日期介于“2005-01-01”和“2005-12-31”之间;如果模型中有datetime/date字段,请使用Django的年份查找:
正如它所说:
Entry.objects.filter(发布日期=2005年)
在sql中等于:
选择发布日期介于“2005-01-01”和“2005-12-31”之间的位置;我知道这一点,但怎么做?@dentemm要么使用\uuu year
查找,要么知道日期必须在年内,使用start\uu gte=datetime.date(kwargs['year1',1,1),start\uu lte=datetimedate(kwargs['year1',12,31)
我不确定您期望的是什么,但在Python 2和3中,我得到了值错误:当我尝试datetime.date(YYYY,0,0)
时,month必须在1..12
中。zero,zero格式来自哪里?我的错误,month和day不能是0,它们应该是1(或不同的数字).I时间实例0的大小写是一个可能的值,但不适用于日期。正如错误所示,self.kwargs['year1']
是一个字符串(例如'2017'
)。您需要使用int(self.kwargs['year1'])
。因为(?P[0-9]{2})
仅匹配两位数字,您还必须将其转换为4位数字的年份。我知道这一点,但怎么做?@dentemm要么使用\uuuu year
查找,要么知道日期必须在年内,使用start\uu gte=datetime.date(kwargs['year1',1,1),start\uu lte=datetimedate(kwargs['year1',12,31)
我不确定您期望的是什么,但在Python2和Python3中,当我尝试datetime.date(YYYY,0,0)
时,我得到了ValueError:month必须在1..12
中。zero,zero格式来自何处?我的错误是,month和day不能是0,它们应该是1(或不同的数字)。我假设时间实例是0