2012-09-03 10 views
8

ho fatto le initial installation passi e ha creato le revisioni iniziali, ma poi quando salvo un modello in guscio Django, non viene creata la nuova revisione:Django reversione non salva revisioni effettuate in guscio

In [1]: s = Shop.objects.all()[0] 
In [2]: import reversion 
In [3]: s.name = 'a' 
In [4]: s.save() 
In [5]: s.name = 'b' 
In [6]: s.save() 

In [7]: reversion.get_for_object(s) 
Out[7]: [<Version: <1> "X">] 

Questo è la revisione iniziale.

Quando aggiorno il modello da una vista, una revisione viene creata correttamente.

Cosa mi manca?

Il file models.py è:

... 
class Shop(Model): 
    ... 


import reversion 
reversion.register(Shop) 
<EOF> 

vedo un metodo di inversione tra post_save ricevitore, anche se non viene chiamato quando il debug di esso.

Ho Django v1.4.1, reversione v1.6.2.

+0

[Questo thread] (https://groups.google.com/forum/ ? fromgroups = #! msg/django-reversion/s7p3nTemR04/tMTF1ZuOjmEJ) fa luce sul problema. Dove stai registrando i tuoi modelli con le revisioni? –

+0

Puoi provare a mettere le righe in "importazione reversione"; reverseion.register (Shop) 'nella parte inferiore del file' models.py' dove si definisce 'Shop', e vediamo se questo risolve il problema? –

+0

@DavidRobinson: è già lì, proprio in fondo. E le revisioni vengono salvate solo nelle viste. –

risposta

21

Ho scritto django-reversion, quindi penso di poter fare un po 'di luce su questo problema.

una versione di un modello viene salvato automaticamente quando un modello viene salvato, fornendo le seguenti condizioni:

  1. Il modello è iscritto su django-reversione.
  2. Il blocco di codice è contrassegnato come all'interno di una revisione.

punto 1 può essere raggiunto sia la registrazione di un modello con VersionAdmin, o esplicitamente chiamando reversion.register() nel file models.py.

Il punto 2 può essere ottenuto utilizzando RevisionMiddleware o il decoratore reversion.create_revision() o il gestore di contesto. Qualsiasi vista amministratore in VersionAdmin salva anche una revisione.

Quindi, se la shell non sta creando versioni, il punto 1 o il punto 2 non vengono soddisfatti. Ecco come risolverlo:

  1. Se si utilizza VersionAdmin, importare il modulo di amministrazione pertinente nel codice shell per avviare la registrazione automatica. In alternativa, chiama reversion.register() nel file models.py.
  2. Nel codice shell, utilizzare il gestore di contesto reversion.create_revision() per la chiamata da salvare.
with reversion.create_revision(): 
    s.save() 

più su questo genere di cose sulla pagina wiki API a basso livello:

http://django-reversion.readthedocs.org/en/latest/api.html

+0

Questo ha senso e mi sono permesso di accedere a https: // github.com/etianen/django-reversion/wiki/pagina wiki API di basso livello .... che ha detto quale è il migliore per garantire che un modello save() crei sempre una versione? segnali? save() override? –

+0

Ottimo suggerimento (n. 2). Suggerisco che questo viene aggiunto alle istruzioni di installazione di django-reversion da quando l'ho disabilitato e non l'ho notato fino a quando non ho trovato questo post ... – Davy