2012-12-13 36 views
8

Trong ứng dụng của tôi, tôi muốn theo dõi tất cả các câu hỏi đang bị xóa. Và vì vậy tôi đã tạo ra một lớp (bảng) như vậy trong tập tin mô hình của tôi.Sử dụng tín hiệu Pre_delete trong 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 

Khi người dùng cố gắng xóa một câu hỏi này xóa hàm được gọi:

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

nghi ngờ của tôi là làm thế nào tôi có thể làm cho một tín hiệu pre_delete của django để cư bảng mới Tôi đã tạo ra.

~ người mới cố gắng công việc khổng lồ ~ Cảm ơn trước :)

+2

Chính xác bạn đang gặp sự cố gì? Bạn đã đọc tài liệu về tín hiệu chưa? https://docs.djangoproject.com/en/dev/topics/signals/ –

Trả lời

26

Bạn bắt đầu bằng cách xác định receiver bạn muốn sử dụng:

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

Sau đó xác định thu trang trí của bạn:

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

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

Thêm hoàn toàn:

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

Bạn có thể đặt chức năng này trong tệp models.py của mình, như bạn biết nó sẽ được tải và kết nối đúng cách.

Vấn đề là bạn không nhận được người dùng yêu cầu xóa. Kể từ khi xóa có thể được kích hoạt từ api django (dòng lệnh, vỏ, vv), mà không có một yêu cầu liên kết với nó. Vì lý do này, bạn có thể muốn tránh sử dụng tín hiệu nếu điều tuyệt đối quan trọng là bạn lưu trữ người dùng cùng với xóa.

+0

Cảm ơn bạn đã trả lời :) Nhưng @Josh "class Deleted" tôi đặt là bảng mà tôi vừa tạo ra để họ cn được phổ biến với các giá trị và tôi gặp rắc rối về điều đó. Những gì bạn nói có vẻ rất tốt, đã cố gắng nhưng nó nói không thể nhập khẩu từ django.core.signals nhập pre_delete vì vậy tôi đã cố gắng nhập khẩu từ django.db.models.signals nhập pre_delete. Sau đó, một lần nữa nó phàn nàn rằng không thể nhập khẩu nhận .. Cố gắng googling nó nhưng như đề xuất ở đó, tôi không thể thay đổi hoặc xóa các phiên bản khác của django .. bất kỳ cách giải quyết cho điều đó? và một nghi ngờ-cho id người dùng có thể chúng tôi không nhận được bằng cách sử dụng (cung cấp args) –

+0

Re: người dùng cụ thể, tôi googled xung quanh hy vọng để có được một số câu trả lời và có được xung quanh http://stackoverflow.com/questions/6847952/django-determine này -Những người dùng-là-xóa-khi-sử dụng-sau-xóa-tín hiệu .. cố gắng tìm ra cách nó phù hợp với bối cảnh của tôi :) –

+0

Tôi đang sử dụng Django 1.2 và do đó đã có một vấn đề reg. người nhận tiền. Tôi overcam rằng bằng cách sử dụng post_delete.connect (my_callback_func, sender = mymodel) Tuy nhiên Im gặp khó khăn khi nhận được người dùng đã xóa, bạn có thể bảo lãnh tôi ra :) –

Các vấn đề liên quan