Django 的日期范围表单
我正在尝试制作一个表单,让用户选择一个日期范围,以便在Django中生成一个网页查询。不过,我在视图中遇到了错误,无法正确处理日期过滤,我无法去掉日期的多余部分。
这是我的 forms.py
文件:
class ReportFiltersForm(forms.Form):
start_date = forms.DateField(input_formats='%Y,%m,%d',widget=SelectDateWidget())
end_date = forms.DateField(input_formats='%Y,%m,%d',widget=SelectDateWidget())
还有我的视图:
if request.method == 'POST':
form = ReportFiltersForm(request.POST)
sdy = request.POST['start_date_year']
sdm = request.POST['start_date_month']
sdd = request.POST['start_date_day']
edy = request.POST['end_date_year']
edm = request.POST['end_date_month']
edd = request.POST['end_date_day']
start_date= datetime.date(sdy, sdm, sdd)
end_date= datetime.date(edy, edm,edd)
错误追踪信息:
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 651, in __call__
return self.application(environ, start_response)
File "/usr/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 241, in __call__
response = self.get_response(request)
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py", line 134, in get_response
return self.handle_uncaught_exception(request, resolver, exc_info)
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py", line 154, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py", line 92, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/home/projects/acms/cms/views.py", line 470, in eventreports
start_date= datetime.date(sdy, sdm, sdd)
TypeError: an integer is required
1 个回答
3
你在这里犯了很多错误。
首先,要解决你的 TypeError
问题,你需要把数据转换成 int
,可以这样做:
...
sdy = int(request.POST['start_date_year'])
#Do the same with the other 5 fields
不过,这种做法其实并不好。首先,你需要在每个字段周围加上 try/except
代码块,以确保用户输入的是整数,而不是字符串。
既然你已经在使用 Django 表单,为什么不让它来帮你处理这些事情呢?你可以这样做:
if request.method == 'POST':
form = ReportFiltersForm(request.POST)
if form.is_valid():
start_date = form.cleaned_data['start_date']
end_date = form.cleaned_data['end_date']
#Do whatever you need to do with this data now. Since you had
#defined the fields as DateFields, you will automatically get
#datetime.date objects.
else:
return render_to_response('mytemplate.html', {'form' : form})
....
这样做要好得多,原因有几个。使用这种方法,你可以让 Django 帮你验证用户输入。此外,它还会把这些数据转换成 datetime.date
对象。最后,如果用户输入了无效数据,它会给你提供更好的错误提示。