2011-08-09 35 views
14

Tôi đang cố gắng tạo một hệ thống cho phép người dùng tải lên tệp zipfile và sau đó giải nén nó bằng cách sử dụng tín hiệu post_save.tín hiệu django, cách sử dụng "instance"

class Project: 
    .... 
    file_zip=FileField(upload_to='projects/%Y/%m/%d') 

@receiver(post_save, sender=Project) 
def unzip_and_process(sender, **kwargs): 
    #project_zip = FieldFile.open(file_zip, mode='rb') 
    file_path = sender.instance.file_zip.path 
    with zipfile.ZipFile(file_path, 'r') as project_zip: 
     project_zip.extractall(re.search('[^\s]+(?=\.zip)', file_path).group(0)) 
     project_zip.close() 

unzip_and_process phương pháp hoạt động tốt khi đường dẫn tập tin chính xác được cung cấp (trong trường hợp này, tôi cần phải cung cấp instance.file_zip.path. Tuy nhiên, tôi không thể nhận/đặt trường hợp với các tín hiệu. Django tài liệu về tín hiệu không rõ ràng .? và đã không có ví dụ Vì vậy, tôi phải làm gì

Trả lời

19

Trên thực tế, Django's documentation about signals là rất rõ ràng và có chứa các ví dụ

Trong trường hợp của bạn, post_save tín hiệu sẽ gửi các đối số sau đây:. sender (lớp mô hình), instance (inst ance của lớp sender), created, rawusing. Nếu bạn cần truy cập instance, bạn có thể truy cập nó bằng cách sử kwargs['instance'] trong ví dụ của bạn hoặc, tốt hơn, thay đổi chức năng gọi lại bạn để chấp nhận lập luận:

@receiver(post_save, sender=Project) 
def unzip_and_process(sender, instance, created, raw, using, **kwargs): 
    # Now *instance* is the instance you want 
    # ... 
+0

Tôi nghĩ rằng đó là về '** kwargs' mà tôi chưa biết. Ví dụ của bạn hoạt động tốt, cảm ơn bạn. –

+0

@ Ferdinand Không có ví dụ về post_save trong tài liệu django. – Anuj

+0

@Anuj - Tôi chưa bao giờ nói có bất kỳ ví dụ nào về 'post_save'. Có những ví dụ về cách sử dụng tín hiệu nói chung, và chúng cũng áp dụng cho 'post_save', vì không có gì đặc biệt về tín hiệu đặc biệt này. –

1

này làm việc cho tôi khi kết nối Django Signals:

Đây là các models.py:

class MyModel(models.Model): 
    name = models.CharField(max_length=100) 

Signal đó truy cập vào nó post_save:

@receiver(post_save, sender=MyModel) 
def print_name(sender, instance, **kwargs): 
    print '%s' % instance.name 
Các vấn đề liên quan