2012-12-13 15 views
8

W mojej aplikacji chcę śledzić wszystkie pytania, które są usuwane. Stworzyłem więc klasę (tabelę) jako taką w moim pliku modeli.Używanie Pre_delete Signal w 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 

Gdy użytkownik próbuje usunąć pytanie to usunięcie funkcja nazywa się:

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

Moje wątpliwości jest to, jak mogę zrobić pre_delete sygnał Django aby wypełnić nową tabelę I utworzony.

~ newbie próbuje mocny zadanie ~ góry dzięki :)

+2

Z czym dokładnie masz problemy? Czy czytałeś dokumentację dotyczącą sygnałów? https://docs.djangoproject.com/en/dev/topics/signals/ –

Odpowiedz

26

Zaczynasz od zdefiniowania receiver chcesz użyć:

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

Następnie określić odbiornik dekorator:

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

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

Dodaj jeszcze razem:

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

Możesz umieścić tę funkcję w swoim pliku models.py, ponieważ wiesz, że będzie ona poprawnie załadowana i podłączona.

Problemem jest jednak to, że nie dostaniesz użytkownika żądającego usunięcia. Ponieważ usuwanie może zostać wywołane z api django (linii poleceń, powłoki, itp.), Które nie ma powiązanego z nim żądania. Z tego powodu możesz chcieć uniknąć używania sygnałów, jeśli absolutnie krytyczne jest przechowywanie użytkownika wraz z usunięciem.

+0

Dziękuję za odpowiedź :) Ale @Josh "usunięta klasa", którą umieściłem, to nowo utworzona tabela, aby zapełnić ją wartościami i miałem z tym problemy. To, co powiedziałeś, wygląda bardzo dobrze, wypróbowało to, ale powiedziało, że nie można zaimportować z importu django.core.signals pre_delete, więc próbowałem importować od importu django.db.models.signals pre_delete. Znowu skarżył się, że nie może zaimportować odbiornika. Próbowałem googlować, ale jak zasugerowałem tam, nie mogę zmienić ani usunąć innych wersji django .. żadnych obejść dla tego? i jeden identyfikator użytkownika wątpliwości, dla nie możemy uzyskać stosując (zapewniające args) –

+0

Re: konkretnego użytkownika, google wokół nadzieję uzyskać jakąś odpowiedź i obeszli ten http://stackoverflow.com/questions/6847952/django-determine -który-użytkownik-usuwa-kiedy-używa-po-usuwaniu-sygnału .. próbuje dowiedzieć się, jak to pasuje do mojego kontekstu :) –

+0

Używam Django 1.2 i tak był problem z reg. imprting reciever. I overcam że korzystając post_delete.connect (my_callback_func, nadawca = mymodel) Jednakże Im kłopoty z dostaniem użytkownika, który usunięty, może mi pan wyskoczyć :) –

Powiązane problemy