2010-03-31 6 views
1

J'essaie de trouver un formulaire qui permette à l'utilisateur de sélectionner une plage de dates pour générer une requête Web dans Django. J'ai des erreurs en obtenant la date de filtrer avec à mon avis, je suis incapable de dépouiller la date.Django Formulaire pour la période

Voici mon 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()) 

Et moi

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

L'indentation est significative en Python. Je l'ai corrigé ici, mais s'il vous plaît soyez plus prudent à l'avenir. – supervacuo

Répondre

3

Il y a beaucoup d'erreurs que vous faites ici.

Tout d'abord, pour fixer votre TypeError, vous devez jeter vos données dans int comme ceci:

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

Cependant, c'est une façon vraiment mauvais de faire les choses. Pour un, vous devrez mettre try/except blocs autour de chaque champ pour vous assurer que l'utilisateur a entré un entier et non une chaîne.

Puisque vous utilisez déjà Django Forms, pourquoi ne pas le laisser faire tout le travail pour vous? Voici comment vous pourriez faire ceci:

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}) 
.... 

Ceci est une bien meilleure façon de faire les choses pour plusieurs raisons. De cette façon, vous pouvez laisser Django prendre soin de valider la saisie de l'utilisateur pour vous. En outre, il va également diffuser ces données dans datetime.date objets. Enfin, il vous permettra de donner de meilleurs messages d'erreur à votre utilisateur s'il a entré des données invalides.