2012-12-13 4 views
8

Nella mia app voglio tenere traccia di tutte le domande che vengono eliminate. E così ho creato una classe (tabella) come tale nel mio file di modelli.Utilizzo del segnale Pre_delete in django

class Deleted(models.Model): 
question = models.IntegerField(null=True, blank=True)#id of question being deleted 
user = models.IntegerField(null=True, blank=True)#id of user deleting the question 
dt = models.DateTimeField(null=True, blank=True)#time question is deleted 

Quando un utente tenta di eliminare una domanda Questa funzione di eliminazione si chiama:

def delete_questions(request, user, questions): 
    for q in questions: 
     q.delete() 

mio dubbio è come posso fare un segnale pre_delete di Django per popolare la nuova tabella che ho creato.

~ newbie cercando compito pesante ~ Grazie in anticipo :)

+2

Che cosa hai esattamente problemi? Hai letto la documentazione relativa ai segnali? https://docs.djangoproject.com/en/dev/topics/signals/ –

risposta

26

Si inizia con la definizione del receiver che si desidera utilizzare:

def log_deleted_question(sender, instance, using, **kwargs): 
    d = Deleted() 
    d.question = instance.id 
    d.dt = datetime.datetime.now() # consider using auto_now=True in your Deleted definition 
    # not sure how you'd get the user via a signal, 
    # since it can happen from a number of places (like the command line) 
    d.save() 

Poi definire il decoratore del ricevitore:

from django.db.models.signals import pre_delete 
from django.dispatch import receiver 

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_log') 

Aggiungi il tutto:

from django.db.models.signals import pre_delete 
from django.dispatch import receiver 

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_signal') 
def log_deleted_question(sender, instance, using, **kwargs): 
    d = Deleted() 
    d.question = instance.id 
    d.dt = datetime.datetime.now() 
    d.save() 

È possibile inserire questa funzione nel file models.py, poiché si sa che verrà caricato e connesso correttamente.

Il problema però è che non si ottiene l'utente che richiede l'eliminazione. Dal momento che una cancellazione può essere attivata dal django api (riga di comando, shell, ecc.), A cui non è associata una richiesta. Per questo motivo, potresti voler evitare di utilizzare i segnali se è assolutamente fondamentale archiviare l'utente insieme all'eliminazione.

+0

Grazie per aver risposto :) Ma @Josh la "classe cancellata" che ho messo è la tabella che ho appena creato in modo che possano essere popolati con i valori e ho avuto problemi a riguardo. Quello che hai detto sembra molto buono, lo ha provato ma non ha potuto importare da django.core.signals import pre_delete così ho provato a importare come da django.db.models.signals import pre_delete. Poi di nuovo si è lamentato che non è stato possibile importare il destinatario .. Ho cercato su Google ma come suggerito lì, non posso modificare o eliminare altre versioni di Django. Qualche soluzione alternativa per questo? e un dubbio - per l'id utente non possiamo usare (fornendo argomenti) –

+0

Re: l'utente specifico, ho cercato su google intorno sperando di ottenere una risposta e aggirato questo http://stackoverflow.com/questions/6847952/django-determine -che-utente-sta-eliminando-quando-usa-post-cancella-segnale .. cercando di capire come si adatta al mio contesto :) –

+0

Sto usando Django 1.2 e quindi c'era un problema reg. ricevendo il ricevitore. Ho risolto il problema utilizzando post_delete.connect (my_callback_func, sender = mymodel) Tuttavia, avendo problemi a ottenere l'utente che ha eliminato, potresti salvarmi? –