django- concatenate(year,month)_range=[start_date,end_date] 错误
django- concatenate(year,month)_range=[start_date,end_date] error
在 SQL 中,有分隔列 "year" 和 "month",现在基于 jquery 日期时间选择器。我可以从表单中以 yyyymm 的格式获取日期条目,例如 201012。
问题是如何根据django表单日期输入范围来过滤数据库。
以下是views.py的一部分,queryset语句不正确。请帮忙指正
if form.is_valid():
start_date=form.cleaned_data['start_date'] <---format is like 201012>
end_date=form.cleaned_data['end_date']
queryset=Result.objects.filter(concatenate(year,month)_range=[start_date,end_date]) <!--filter in database)
另一个问题是:
因为它只是 YYYYMM,所以如果我像下面这样定义 start_date,它不会匹配 html (YYYYMM) 中的日期格式。那么我怎样才能在models.py中改变呢?
我试过类似的东西:
start_date=models.DateField(auto_now=False, auto_now_add=False,default=datetime.now().strftime("%m.%Y")) but it is not correct.
models.py :
start_date=models.DateField(auto_now=False, auto_now_add=False)
end_date=models.DateField(auto_now=False, auto_now_add=False)
forms.py
start_date=forms.DateField(widget=DateInput(),required=False)
end_date=forms.DateField(widget=DateInput(),required=False)
编辑后回溯
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.py" in get
159. self.object_list = self.get_queryset()
File "C:\Users\user\Desktop\xxxx\views.py" in get_queryset
90. start_date = datetime.strptime(form.cleaned_data['start_date'], '%Y%m') # format is like 201012
Exception Type: TypeError at /result_list/
Exception Value: must be string, not datetime.date
要使此功能生效,您需要执行几个步骤:
配置您的表单域以接受“YYYYMM
”格式的日期。在您的表格中 class:
start_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False)
end_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False)
这将允许 Django 自动解析您的表单数据并将其正确保存为 datetime
对象。请注意,它将存储为完整日期(默认为每月的第一天)- 您不能使用 DateField
并要求它存储除完整日期以外的任何内容 .
在您的模型中,像这样设置默认值:
start_date=models.DateField(auto_now_add=True)
您必须在 DateField
中存储完整的日期,所以让它默认为当前日期即可。这仍然会在下面给出正确的结果(假设该月的哪一天对您来说无关紧要)。
您的查询逻辑现在如下:
if form.is_valid():
# Convert the form inputs into valid datetime objects
start_date = form.cleaned_data['start_date']
end_date = form.cleaned_data['end_date']
# These are full dates... but we only want to compare month and year, so:
queryset=Result.objects.filter(
start_date__year__gte=start_date.year,
start_date__month__gte=start_date.month,
end_date__year__lte=end_date.year,
end_date__month__lte=end_date.month)
在 SQL 中,有分隔列 "year" 和 "month",现在基于 jquery 日期时间选择器。我可以从表单中以 yyyymm 的格式获取日期条目,例如 201012。
问题是如何根据django表单日期输入范围来过滤数据库。
以下是views.py的一部分,queryset语句不正确。请帮忙指正
if form.is_valid():
start_date=form.cleaned_data['start_date'] <---format is like 201012>
end_date=form.cleaned_data['end_date']
queryset=Result.objects.filter(concatenate(year,month)_range=[start_date,end_date]) <!--filter in database)
另一个问题是:
因为它只是 YYYYMM,所以如果我像下面这样定义 start_date,它不会匹配 html (YYYYMM) 中的日期格式。那么我怎样才能在models.py中改变呢?
我试过类似的东西:
start_date=models.DateField(auto_now=False, auto_now_add=False,default=datetime.now().strftime("%m.%Y")) but it is not correct.
models.py :
start_date=models.DateField(auto_now=False, auto_now_add=False)
end_date=models.DateField(auto_now=False, auto_now_add=False)
forms.py
start_date=forms.DateField(widget=DateInput(),required=False)
end_date=forms.DateField(widget=DateInput(),required=False)
编辑后回溯
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.py" in get
159. self.object_list = self.get_queryset()
File "C:\Users\user\Desktop\xxxx\views.py" in get_queryset
90. start_date = datetime.strptime(form.cleaned_data['start_date'], '%Y%m') # format is like 201012
Exception Type: TypeError at /result_list/
Exception Value: must be string, not datetime.date
要使此功能生效,您需要执行几个步骤:
配置您的表单域以接受“
YYYYMM
”格式的日期。在您的表格中 class:start_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False) end_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False)
这将允许 Django 自动解析您的表单数据并将其正确保存为 datetime
对象。请注意,它将存储为完整日期(默认为每月的第一天)- 您不能使用 DateField
并要求它存储除完整日期以外的任何内容 .
在您的模型中,像这样设置默认值:
start_date=models.DateField(auto_now_add=True)
您必须在 DateField
中存储完整的日期,所以让它默认为当前日期即可。这仍然会在下面给出正确的结果(假设该月的哪一天对您来说无关紧要)。
您的查询逻辑现在如下:
if form.is_valid(): # Convert the form inputs into valid datetime objects start_date = form.cleaned_data['start_date'] end_date = form.cleaned_data['end_date'] # These are full dates... but we only want to compare month and year, so: queryset=Result.objects.filter( start_date__year__gte=start_date.year, start_date__month__gte=start_date.month, end_date__year__lte=end_date.year, end_date__month__lte=end_date.month)