2009-08-06 11 views
8

Saluti, Sto cercando di implementare un modello TimeField che consiste solo nel formato HH: MM (cioè 16:46), so che è possibile formattare un normale oggetto orario Python ma sono perso su come gestirlo con Django.Django TimeField Modello senza secondi

Acclamazioni

risposta

6

DateTime fields sarà sempre memorizzare anche secondi; tuttavia, si può facilmente dire il modello per mostrare solo le ore ei minuti, con il filtro time:

{{ value|time:"H:M" }} 

dove "valore" è la variabile che contiene il campo datetime.

Ovviamente, è anche possibile ricorrere ad altri trucchi, come ritagliare i secondi dal campo mentre si salva; sarebbe necessario solo un piccolo cambiamento al codice nella visualizzazione gestione della forma, a fare qualcosa di simile:

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.nosecs = instance.nosecs.strptime(instance.nosecs.strftime("%H:%M"), "%H:%M") 
    instance.save() 

(nota: si tratta di un codice di brutto e non testato, tanto per dare l'idea)

Infine, dovresti notare che l'amministratore continuerà a visualizzare i secondi nel campo.
Tuttavia, non dovrebbe essere una grande preoccupazione, perché l'amministratore dovrebbe essere utilizzato solo da un tipo di utenti che può essere istruito a non utilizzare quella parte del campo.
Nel caso in cui si desideri applicare la patch anche all'amministratore, è comunque possibile assegnare il proprio widget al modulo e avere quindi l'amministratore che lo utilizza. Ovviamente, ciò significherebbe un notevole sforzo aggiuntivo.

+0

{{value | tempo: "H: i"}} ha lavorato per me. – GvS

+1

Nelle maschere delle viste in classe Django l'impostazione di TIME_INPUT_FORMATS nelle impostazioni ha funzionato per me. https://docs.djangoproject.com/en/dev/ref/settings/#time-input-formats – maciek

+0

@maciek: non ha funzionato per me. L'impostazione 'TIME_INPUT_FORMATS = [ '% H:% M', ] in' settings.py' non era abbastanza. Ho dovuto specificare il widget. – SaeX

3

Quindi penso che la soluzione proposta e accettata non è ottimale perché con:

datetime.widget = forms.SplitDateTimeWidget(time_format=('%H:%M')) 

Per uno SplitDateTimeField nel mio caso, ma per cambiare solo a TimeWidget.

Spero che aiuti anche gli altri.

4

Il widget di Django può essere utilizzato per ottenere facilmente questo risultato.

from django import forms 

class timeSlotForm(forms.Form): 
    from_time = forms.TimeField(widget=forms.TimeInput(format='%H:%M')) 
2

modello TimeField

in Template

viene visualizzato

{{ value|time:"H:i" }} 


non viene visualizzata

{{ value|time:"H:M" }} 

Django 1.4.1

1

Per un ModelForm, si può facilmente aggiungere un widget come questo, per evitare i secondi viene mostrato (solo mostrare hh: mm):

class MyCreateForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 
     fields = ('time_in', 'time_out',) 
     widgets = { 
      'time_in': forms.TimeInput(format='%H:%M'), 
      'time_out': forms.TimeInput(format='%H:%M'), 
     }