2009-08-04 13 views
7

Ho un modello django chiamato Blog.Django: ultimi modelli data mod e conteggio mod

Vorrei aggiungere un campo al mio modello corrente che è per last_modified_date. So come impostare un valore predefinito, ma vorrei in qualche modo che venisse aggiornato automaticamente ogni volta che modifico il post di blog tramite l'interfaccia di amministrazione.

C'è un modo per forzare questo valore all'ora corrente su ogni sito di amministrazione di salvataggio?

Inoltre, sarebbe possibile aggiungere un campo mod_count e calcolarlo automaticamente su ciascuna modifica del post di blog del sito di amministrazione?

risposta

12

Creare un DateTimeField nel modello. Fallo aggiornare ogni volta che viene salvato. Ciò richiede di utilizzare l'opzione auto_now_add:

class DateTimeField([auto_now=False, auto_now_add=False, **options]) 

DateTimeField.auto_now_add¶

impostare automaticamente il campo per ora ogni volta che l'oggetto viene salvato. Utile per i timestamp "last-modified". Nota che la data corrente è sempre utilizzata; non è solo un valore predefinito che puoi sostituire con lo .

Dovrebbe essere qualcosa di simile:

class Message(models.Model): 
    message = models.TextField() 
    active = models.BooleanField(default=True) 
    created_at = models.DateTimeField(auto_now_add=True) 

Model field reference

Per la seconda parte, penso che bisogna sovraccaricare

ModelAdmin.save_model(self, request, obj, form, change) 

Come James Bennett descrive here. Assomiglierà a questo:

class EntryAdmin(admin.ModelAdmin): 

def save_model(self, request, obj, form, change): 
    if change: 
     obj.change_count += 1 
    obj.save() 
+0

Grazie, conosci un modo per incrementare automaticamente un numero di 1 su ogni salvataggio? –

+0

Sì, penso che devi sovraccaricare Model.save() per fare l'incremento durante il salvataggio. James Bennett ha un articolo su b-list.org, come ricordo. Il suo articolo aveva a che fare con il salvataggio dell'utente corrente su un record nell'interfaccia di amministrazione. Non ho ancora trovato l'articolo .... – hughdbrown

+0

Almeno 1.4, il 'Utile per "timestamp dell'ultima modifica". nota è su 'auto_now' piuttosto che su' auto_now_add'. Quest'ultimo utilizzerà l'ora corrente solo per creare, non per aggiornare. –

2

Esistono diversi modi per aumentare il conteggio delle modifiche ogni volta che viene salvato.

Il modello stesso ha un metodo save() e il modello di amministrazione ha un metodo model_save().

Così, per esempio, diciamo che si voleva che incrementa quando è stato modificato con lo strumento di amministrazione ....

models.py: 

class MyModel(models.Model): 
    edit_count = models.IntegerField() 
    # ... rest of model code here... 


admin.py: 

class MyModelAdmin(admin.ModelAdmin) 
    def save_model(self, request, obj, form, change): 
     if not change: 
      obj.edit_count = 1 
     else: 
      obj.edit_count += 1 
     obj.save() 

Si potrebbe fare un codice simile al largo del modello save() evento così.


Qualcos'altro si può essere interessati a è django-command-extensions. Aggiunge 2 campi che possono essere utili a voi:

  • CreationDateTimeField - DateTimeField che verrà automaticamente impostato è data quando l'oggetto viene prima salvato nel database.

  • ModificationDateTimeField - DateTimeField che imposterà automaticamente la data in cui un oggetto viene salvato nel database.

+0

Potete indicarmi la documentazione che dice che auto_now_add è deprecato? Recentemente, nel 2008-06-15, questa affermazione è stata negata: "Non so chi sia l'anonimo, ma auto_now_add non è ancora stato deprecato. Si è parlato di deprecazione e c'è un modo migliore (default = datetime .now), ma per il momento, auto_now_add è ancora un'opzione valida. "http://code.djangoproject.com/ticket/7390 – hughdbrown

+0

Ho copiato la descrizione del campo dalla pagina del progetto dell'app django-command-extensions. Dovresti parlare con loro di questa affermazione. –

+0

Per non propagare informazioni errate * nel caso *, l'ho rimosso dal mio testo incollato. –

0

È inoltre possibile utilizzare una soluzione middleware trovato qui: https://bitbucket.org/amenasse/django-current-user/src/7c3c90c8f5e854fedcb04479d912c1b9f6f2a5b9/current_user?at=default

settings.py

.... 
MIDDLEWARE_CLASSES = (
    .... 
    'current_user.middleware.CurrentUserMiddleware', 
    'current_user.middleware.CreateUserMiddleware', 
) 
.... 
INSTALLED_APPS = (
    'current_user', 
    .... 
    .... 
) 

models.py

class ExampleModel(models.Model): 
    foo = models.IntegerField() 
    last_user = CurrentUserField(related_name="+") 
    created_by = CreateUserField(related_name="+") 
5

La risposta accettata non è più corretta.

Per le versioni più recenti di django, è necessario utilizzare il parametro auto_now=True anziché auto_now_add=True, che imposterà il valore del campo solo quando l'oggetto viene inizialmente creato.

Dal documentation:

DateField.auto_now_add¶

impostare automaticamente il campo per ora quando l'oggetto viene creato. Utile per la creazione di timestamp.

La funzionalità desiderata è ora attuate dalle auto_now:

DateField.auto_now¶

impostare automaticamente il campo per ora ogni volta che l'oggetto viene salvato.

Quindi, per raggiungere l'auto-aggiornamento timestamp un modello deve essere creato in questo modo:

class Message(models.Model): 
    message = models.TextField() 
    active = models.BooleanField(default=True) 
    created_at = models.DateTimeField(auto_now=True) 
    mod_count = models.IntegerField(default=0) 

Per incrementare mod_count ogni volta questo modello viene modificato sovraccarico save() il metodo del modello:

def save(self, *args, **kwargs): 
     self.mod_count +=1 
     return super(Message,self).save(*args, **kwargs)