2012-12-13 20 views
8

在我的應用程序中,我想跟蹤所有被刪除的問題。所以我在模型文件中創建了類(表)。在Django中使用Pre_delete信號

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 

當用戶試圖刪除問題該刪除功能被稱爲:

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

我懷疑是我怎樣才能讓Django的填充我創建了新表的pre_delete信號。

〜新手試圖沉重的任務〜 感謝提前:)

+2

你究竟在遇到什麼麻煩?你讀過有關信號的文件嗎? https://docs.djangoproject.com/en/dev/topics/signals/ –

回答

26

您可以通過定義開始的receiver要使用:

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

然後定義你的接收機裝飾:

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

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

一起加入:

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

您可以將此函數放入您的models.py文件中,因爲您知道它將被正確加載和連接。

雖然問題是,你沒有得到用戶請求刪除。由於可以從django api(命令行,shell等)中觸發刪除,該刪除沒有與其關聯的請求。出於這個原因,如果將用戶與刪除一起存儲非常重要,則可能希望避免使用信號。

+0

謝謝你回答:)但@Josh「類刪除」我放了我新創建的表,以便他們cn填充值,而我在這方面遇到了麻煩。你說什麼看起來非常好,嘗試過,但它說不能從django.core.signals導入pre_delete導入,所以我試圖從django.db.models.signals導入pre_delete導入。然後再次抱怨說,無法導入接收器..試圖用Google搜索它,但正如那裏的建議,我不能更改或刪除其他版本的Django ..任何解決方法?和一個疑問 - 用戶ID我們可以不使用(提供參數) –

+0

回覆:特定用戶,我搜索周圍希望得到一些答案,並得到解決這個http://stackoverflow.com/questions/6847952/django-determine - 這是用戶正在刪除時使用後刪除信號..試圖找出它如何適合我的上下文:) –

+0

我使用Django 1.2,所以有一個問題註冊。招攬接收者。我overcam,通過使用post_delete.connect(my_callback_func,發件人= myModel)但是我無法讓用戶誰刪除,你可以保釋出:) –