Джанго Форма для диапазона дат - PullRequest
1 голос
/ 31 марта 2010

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

1 Ответ

3 голосов
/ 31 марта 2010

Здесь вы делаете много ошибок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...