2012-12-13 4 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() 

내 의심의 여지가 내가 만든 새 테이블을 채우는 장고의 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 파일에 넣을 수 있습니다.

그러나 문제는 사용자가 삭제를 요청하지 않는다는 것입니다. delete는 django api (명령 행, 쉘 등)에서 트리거 될 수 있기 때문에 관련 요청을 가지고 있지 않습니다. 따라서 사용자를 삭제와 함께 저장하는 것이 절대적으로 중요 할 경우 신호를 사용하지 않는 것이 좋습니다.

+0

답변 주셔서 감사합니다 :)하지만 @ 조쉬는 "수업 Deleted"나는 새로 만든 테이블 그래서 그들이 값으로 채워지도록 만들어집니다 , 나는 그것에 관해서 문제가 있었다. 당신이 말한 것은 매우 좋아 보이지만 그것을 시도 django.db.models.signals 가져 오기 pre_delete에서 가져 오기 시도 그래서 그것은 django.core.signals 가져 오기 pre_delete에서 가져올 수 없습니다. 그럼 다시 그것은 수신기를 가져올 수 없다는 불평 .. 그것을 시도했지만 거기에 제안 된 것처럼, 나는 변경하거나 장고의 다른 버전을 삭제할 수 없습니다 .. 그 모든 해결 방법은? 그리고 의심의 여지가 - 사용자 ID에 대한 우리가 (args 제공)을 사용하여 얻을 수 없다 –

+0

다시 : 특정 사용자, 나는 주위에 좀 답을 얻으려고 그 주위에 봤고 http://stackoverflow.com/questions/6847952/django-determine -which-user-is-delete-when-use-delete-signal ... 내 컨텍스트에 맞는 방법을 찾는 방법 :) –

+0

Django 1.2를 사용하기 때문에 문제가 있습니다. 리시버를 imprting. 나는 post_delete.connect (my_callback_func, sender = mymodel)를 사용하여 그것을 overcam했다. 그러나 삭제 한 사용자를 얻는 데 어려움을 겪고 있는데, 나를 구제 해줄 수 있겠는가? –