Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从url到视图仅传递年份_Python_Regex_Django_Url_View - Fatal编程技术网

Python 如何从url到视图仅传递年份

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)。因此

我有我的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)。因此,在视图中使用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