2015-06-08 5 views
6

Ho un DateField in un modello di Django 1.8, qualcosa di simile:Come utilizzare DateField in un modulo Django in modo timezone-aware?

from django.db import models 
birth_date = models.DateField() 

Quando si va in un form, mi rimetto un oggetto 'naif':

birth_date = the_form.cleaned_data['birth_date'] 

stampa birth_date nel debugger :

ipdb> birth_date 
datetime.date(2015, 6, 7) 

Poi, quando questa cosa viene salvato in un database, ottengo un avvertimento, come le promesse di documentazione:

RuntimeWarning: SQLite received a naive datetime (2015-06-08 01:08:21.470719) while time zone support is active. 

Ho letto somearticles su questo, e sono ancora confuso. Cosa dovrei fare con questa data?

Devo convertirlo in un DateTime, renderlo timezone-aware, quindi tornare in una data? Devo rendere il modello un DateTimeField e abbandonare DateFields? Quali sono le migliori pratiche qui?

risposta

0

Penso che si possa provare a utilizzare make_aware per convertire la data in formato noto. Da make_aware django documentazione:

make_aware (valore, fuso orario = Nessuno, is_dst = None)

Restituisce un datetime consapevoli che rappresenta lo stesso punto nel tempo come valore nel fuso orario, il valore di essere un datetime ingenuo.

Questo dovrebbe risolvere l'avvertimento:

from django.utils import timezone 

birth_date = timezone.make_aware(the_form.cleaned_data['birth_date'], timezone.get_default_timezone()) 
0

@ risposta di Kalo non ha funzionato per me, così ho creato questo funzione di utilità da quello che ha finito per lavorare per me in base alla sua risposta:

from django.utils import timezone 
from django.utils.dateparse import parse_date 
from django.utils.datetime_safe import time 


def make_timezone_aware(date): 
    return timezone.make_aware(timezone.datetime.combine(parse_date(date), time.min)) 

Combinando la data con un 0:00 tempo solved the following errors:

  • oggetto 'datetime.date' non ha un attributo 'tzinfo' oggetto
  • STR non ha un attributo 'tzinfo'
Problemi correlati