2012-12-13 5 views
8

In meiner App möchte ich alle Fragen verfolgen, die gelöscht werden. Und so habe ich eine Klasse (Tabelle) als solche in meiner Modelldatei erstellt.Verwenden von Pre_delete Signal 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 

Wenn ein Benutzer versucht, eine Frage zu löschen Diese löschen Funktion aufgerufen wird:

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

Mein Zweifel ist, wie kann ich ein pre_delete Signal von django machen die neue Tabelle zu füllen ich geschaffen habe.

~ Neuling versuchen, kräftige Aufgabe ~ Vielen Dank im Voraus :)

+2

Mit was genau haben Sie Probleme? Haben Sie die Dokumentation zu Signalen gelesen? https://docs.djangoproject.com/de/dev/topics/signals/ –

Antwort

26

Sie beginnen die durch die Definition receiver Sie verwenden möchten:

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

Dann wird Ihr Empfänger Dekorateur definieren:

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

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

Fügen Sie es zusammen:

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

Sie können diese Funktion in Ihre models.py Datei einfügen, da Sie wissen, dass sie korrekt geladen und angeschlossen wird.

Das Problem besteht jedoch darin, dass Sie den Benutzer, der das Löschen anfordert, nicht erhalten. Da kann ein delete von der django api (Kommandozeile, Shell, etc) ausgelöst werden, der keine Anfrage zugeordnet ist. Aus diesem Grund sollten Sie die Verwendung von Signalen vermeiden, wenn es absolut wichtig ist, dass Sie den Benutzer zusammen mit dem Löschvorgang speichern.

+0

Danke für die Antwort :) Aber @Josh die "Klasse gelöscht" Ich lege die Tabelle, die ich neu erstellt, so dass sie mit den Werten bevölkert werden können und ich hatte Schwierigkeiten damit. Was du gesagt hast, sieht sehr gut aus, versuchte es, aber es konnte nicht importiert werden von django.core.signals Import pre_delete, also versuchte ich Import von django.db.models.signals import pre_delete. Dann wieder beklagte es sich, dass Empfänger nicht importiert werden konnte. Versucht es zu googeln, aber wie dort vorgeschlagen, kann ich keine anderen Versionen von Django ändern oder löschen .. irgendwelche Workarounds dafür? und ein Zweifel-für Benutzer-ID können wir nicht mit (Bereitstellung von Argumenten) –

+0

Re: der spezifische Benutzer, ich googelte um in der Hoffnung, um eine Antwort zu bekommen und um diese http://stackoverflow.com/questions/6847952/django-determinine bekommen - which-user-delete-wenn-benutze-post-delete-signal .. versuche herauszufinden, wie es zu meinem Kontext passt :) –

+0

Ich benutze Django 1.2 und so gab es ein Problem reg. imprinting Empfänger. Ich überkomme das, indem ich post_delete.connect (my_callback_func, sender = mymodel) benutze Aber ich habe Probleme, den Benutzer zu bekommen, der gelöscht hat, könntest du mich rausholen :) –

Verwandte Themen