django – RuntimeWarning: DateTimeField received a naive datetime
2 Febbraio 2017
Abbiamo un form
class ChangeForm(forms.Form): date = forms.DateField(label='date', initial=datetime.date.today) ...
e la view di competenza
def edit(request, item_id): myitem = get_object_or_404(AItem, pk=item_id) if request.method == "POST": form = ChangeForm(request.POST) if form.is_valid(): myitem.date = form.cleaned_data['date'] myitem.save() return redirect(...) else: form = ChangeForm(initial={'date': myitem.date}) return render(request, 'atemplate.html', {'form': form, 'myitem': myitem})
nel momento del salvataggio dei dati (POST) ottengo il warning in oggetto.
per risolvere il problema, tramite timezone di django, trasformiamo le date
da formato ‘naive’ a formato ‘aware’.
Nel mio caso la data è di tipo datetime.date per tento prima,
la trasformerò in formato datetime.datetime.
>>> import datetime >>> from django.utils import timezone >>> a_date = datetime.date.today() >>> a_datetime = datetime.datetime.combine(a_date, datetime.time()) >>> a_datetime datetime.datetime(2017, 2, 2, 0, 0) >>> aware_date = timezone.make_aware(a_datetime, timezone.get_default_timezone()) >>> aware_date datetime.datetime(2017, 2, 2, 0, 0, tzinfo=<UTC>)
oppure tramite il modulo pytz (installabile tramite pip):
>>> import pytz >>> naive = datetime.datetime(2017, 2, 2, 12, 0, 0) >>> aware = datetime.datetime(2017, 2, 2, 12, 0, 0, 0, pytz.UTC) >>> aware == naive Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: can't compare offset-naive and offset-aware datetimes >>> aware == pytz.utc.localize(naive) True
ora basta modificare la view con la gestione corretta delle date:
def edit(request, item_id): myitem = get_object_or_404(AItem, pk=item_id) if request.method == "POST": form = ChangeForm(request.POST) if form.is_valid(): naive_date = form.cleaned_data['date'] naive_datetime = datetime.datetime.combine(naive_date, datetime.time()) myitem.date = timezone.make_aware(naive_datetime, timezone.get_default_timezone()) myitem.save() return redirect(...) else: form = ChangeForm(initial={'date': myitem.date}) return render(request, 'atemplate.html', {'form': form, 'myitem': myitem})
Commenti recenti