2012-07-08 25 views
6

He modelado una clase llamada ConversationHistory. Cada vez que se crea una instancia, deseo establecer la fecha actual y la hora actual.Cómo modelar un TimeField en Django?

class ConversationHistory(models.Model): 
    contact_date  = models.DateField(_(u"Conversation Date"),  blank=True) 
    contact_time  = models.DateTimeField(_(u"Conversation Time"), blank=True) 

    def __init__(self, *args, **kwargs): 
     super(ConversationHistory, self).__init__(*args, **kwargs) 
     self.contact_date = datetime.datetime.now() 
     self.contact_time = datetime.datetime.now() 

La idea es que el usuario aún pueda ajustar la fecha y la hora como dos campos diferentes.

Ahora estoy un poco perdido cómo hacer el campo de tiempo solo para mostrar y aceptar el tiempo, en lugar de la fecha y la hora. Reconozco que no es posible tener un campo de tiempo sin fecha y hora, pero ¿cómo mostraría solo la hora en el formulario?

+4

Hay una [TimeField] (https://docs.djangoproject.com/en/dev/ref/models/fields/#timefield) –

+1

en su forma debe ser capaz de dar formato al campo como [ contact_time.strftime ("% H:% M")] (http://docs.python.org/library/time.html#time.strftime) –

+0

@ César sí que lo haría. :) Solo una última cosa, para eliminar los segundos, ¿tengo que hacerlo en la declaración del widget de formulario? – Houman

Respuesta

10

Si quieres única vez, TimeField es lo que necesita:

class ConversationHistory(models.Model): 
    contact_date = models.DateField(_(u"Conversation Date"), blank=True) 
    contact_time = models.TimeField(_(u"Conversation Time"), blank=True) 

usted puede tomar ventaja de la opción auto_now_add:

TimeField clase ([auto_now = False, auto_now_add = False, ** opciones])

Hora, representada en Python por una instancia datetime.time. Acepta las mismas opciones de autopoblación que DateField.

Si usa auto_now_add, establecerá automáticamente el campo hasta ahora cuando se crea el objeto por primera vez.

class ConversationHistory(models.Model): 
    contact_date = models.DateField(_(u"Conversation Date"), auto_now_add=True, blank=True) 
    contact_time = models.TimeField(_(u"Conversation Time"), auto_now_add=True, blank=True) 
+0

Eso es muy bueno con auto_now_add. Eso significa que ya no necesito hacerlo manualmente en el ctor nunca más? nice – Houman

+1

Creo que debería usar default = datetime.datetime.now en lugar de auto_now_add, el problema es que no puede anular auto_now_add – armonge

+0

Me acabo de dar cuenta de que ni siquiera puedo tener la configuración dentro del constructor del modelo. Dado que incluso la edición de los elementos siempre muestra la fecha y hora actual. Necesito configurar esto dentro de la vista al crear una nueva instancia solamente. – Houman

Cuestiones relacionadas