2010-03-31 3 views
1

Я пытаюсь создать форму, которая позволяет пользователю выбирать диапазон дат для создания веб-запроса в 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

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

ответ

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. Наконец, это позволит вам предоставлять пользователям более качественные сообщения об ошибках, если они ввели неверные данные.

Смежные вопросы