2010-08-07 13 views
85

¿Cuál es la mejor manera de establecer automáticamente una fecha de creación para un objeto, y también un campo que se registrará cuando el objeto se actualizó por última vez?Fecha de creación automática para objetos de formulario modelo django?

En mi modelo que tengo:

created_at = models.DateTimeField(False, True, editable=False) 
updated_at = models.DateTimeField(True, True, editable=False) 

y en mi opinión:

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.user = request.user 
     obj.save() 
     return HttpResponseRedirect('obj_list') 

me sale el error:

objects_object.created_at may not be NULL 

¿Tengo que configurar manualmente este valor a mí mismo ? Pensé que ese era el objetivo de los parámetros pasados ​​a DateTimeFields (o son solo valores predeterminados, y como he configurado 'editable = False' no se muestran en el formulario, por lo tanto, no se envían en la solicitud y, por lo tanto, ¿no te ponen en la forma?).

¿Cuál es la mejor manera de hacerlo? ¿Un método init?

Gracias

ps - Soy un novato Django y Python ...

Respuesta

184

Puede utilizar los auto_now y auto_now_add opciones para updated_at y created_at respectivamente.

class MyModel(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
+14

'auto_now' y' auto_now_add' son considerados malvados, así que trate de evitarlos. [Esta respuesta] (http://stackoverflow.com/a/1737078/1226722) explica por qué y proporciona un mejor enfoque, anulando el método 'save()'. – gregoltsov

+2

produce este error: 'Está intentando agregar un campo no nulo 'created_at' a gameuser sin un valor predeterminado; no podemos hacer eso (la base de datos necesita algo para rellenar filas existentes). Seleccione una solución: 1) Proporcione un valor predeterminado único por única vez (se establecerá en todas las filas existentes) 2) Salga y permítame agregar un valor predeterminado en models.py Seleccione una opción: 1 Ingrese la valor predeterminado ahora, como válido Python Los módulos datetime y django.utils.timezone están disponibles, por lo que puede hacer, por ejemplo timezone.now() >>> timezone.now() ' –

+0

elimine las filas en el databas, o marque la opción 1 y agregue timezone.now() – mullerivan

Cuestiones relacionadas