Utilisation du signal pre delete à django

dans mon application je veux garder une trace de toutes les questions qui sont supprimées. Et donc j'ai créé une classe(table) en tant que telle dans mon fichier models.

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

Lorsqu'un utilisateur essaie de supprimer une question, cette fonction de suppression s'appelle:

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

mon doute est Comment puis-je faire un signal pré_delete de django pour peupler la nouvelle table que j'ai créée.

~novice essayant tâche lourde~ Merci d'avance:)

9
demandé sur The Recruit 2012-12-13 13:42:04

1 réponses

Vous commencez par définir le récepteur vous souhaitez utiliser:

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()

alors définissez votre décorateur récepteur:

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

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

Ajouter au total:

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()

Vous pouvez mettre cette fonction dans votre models.py fichier, comme vous le savez, il sera chargé et connecté correctement.

le problème cependant, c'est que vous ne recevez pas l'utilisateur demandant la suppression. Depuis qu'une suppression peut être déclenchée à partir de l'api django (ligne de commande, shell, etc) ), qui n'a pas de requête associée. Pour cette raison, vous pourriez vouloir éviter d'utiliser des signaux s'il est absolument essentiel que vous stockez l'utilisateur avec la suppression.

29
répondu Josh Smeaton 2016-03-09 10:18:53