2010-03-31 69 views
1

我想要一個讓用戶選擇一個日期範圍來在Django中生成Web查詢的表單。我在查看過濾日期時遇到錯誤,無法取消日期。日期範圍的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 
+0

縮進在Python中很重要。我在這裏糾正了它,但請將來再小心一點。 – supervacuo 2012-08-20 16:48:31

回答

3

有你在這裏做了很多錯誤。

首先,解決您的TypeError,您需要將您的數據投進去int像這樣:

... 
sdy = int(request.POST['start_date_year']) 
#Do the same with the other 5 fields 

然而,這是做事情的一個非常糟糕的方式。首先,你必須在每個字段周圍放置try/except塊,以確保用戶輸入的是整數而不是字符串。

由於您已經在使用Django Forms,爲什麼不讓它爲您完成所有工作?這裏是你如何做到這一點:

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對象。最後,如果他們輸入了無效數據,它將允許您向用戶提供更好的錯誤消息。