2013-03-10 21 views
5

Devo essere in grado di scrivere solo anno, o anno e mese (oltre ai valori standard full datetime) in alcuni dei miei campi datetime. Come questi modelli qui sotto.Django - Servono campi datetime in grado di gestire solo i valori anno, mese e anno

YYYY 
YYYY-MM 
YYYY-MM-DD 
YYYY-MM-DD HH 
YYYY-MM-DD HH:MM 
YYYY-MM-DD HH:MM:SS 

in MySQL questo può facilmente essere fatto utilizzando zeri, ma che non Dos lavorare in Django. È quella stupida funzione python time.datetime che dos non la supporta.

C'è un modo semplice per farlo in django? In caso contrario, ci sono delle estensioni che possono farlo per me? In caso contrario, come posso risolverlo nel modo migliore possibile?

Sarebbe bello se potesse occuparsi di normalizzare l'ora locale se fosse un valore di tempo pieno di dati. In questo modo potrei usare lo stesso campo ovunque. Ma non è super importante.

risposta

7

Forse questo avrebbe aiutato:

DayMonthField e YearField

django-yearlessdate - https://github.com/seddonym/django-yearlessdate

YearMonthField

YEARMONTH_INPUT_FORMATS = (
    '%Y-%m', '%m/%Y', '%m/%y', # '2006-10', '10/2006', '10/06' 
) 

class YearMonthField(CharField): 
    default_error_messages = { 
     'invalid': _('Enter a valid year and month.'), 
    } 

    def __init__(self, input_formats=None, *args, **kwargs): 
     super(YearMonthField, self).__init__(*args, **kwargs) 
     self.input_formats = input_formats 

    def clean(self, value): 
     if value in validators.EMPTY_VALUES: 
      return None 
     if isinstance(value, datetime.datetime): 
      return format(value, '%Y-%m') 
     if isinstance(value, datetime.date): 
      return format(value, '%Y-%m') 
     for fmt in self.input_formats or YEARMONTH_INPUT_FORMATS: 
      try: 
       date = datetime.date(*time.strptime(value, fmt)[:3]) 
       return format(date, '%Y-%m') 
      except ValueError: 
       continue 
     raise ValidationError(self.error_messages['invalid']) 

class MyModel(models.Model): 
    yearmonth = YearMonthField() 
+1

se avete domanda, risponderò domani. Bisogno di dormire – catherine

+0

Ciao! Quando ho implementato questo mi ha mostrato '(fields.E120) CharFields deve definire un attributo 'max_length'. Eventuali suggerimenti? –

+0

@Abhishek Bhatia devi mettere max_length = 100 (o qualunque numero) per ogni CharField. Django richiede di utilizzare questo parametro, in questo modo: var = model.CharField (max_length = 100) – MrVocabulary

Problemi correlati