django信号,如何使用“实例”

时间:2011-08-09 06:28:11

标签: django signals instance

我正在尝试创建一个系统,使用户能够上传zip文件,然后使用post_save信号将其解压缩。

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方法工作正常(在这种情况下,我需要提供instance.file_zip.path。但是,我无法使用信号获取/设置实例.Django文档关于信号不清楚,没有例子。那么,我该怎么办?

2 个答案:

答案 0 :(得分:21)

实际上,Django's documentation about signals非常明确,并且包含示例。

在您的情况下,post_save信号发送以下参数:sender(模型类),instance(类sender的实例),{{1 },createdraw。如果您需要访问using,可以在示例中使用instance访问它,或者更好的是,更改您的回调函数以接受参数:

kwargs['instance']

答案 1 :(得分:0)

连接Django Signals时,这对我有用:

以下是 models.py

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

访问它的信号 post_save

@receiver(post_save, sender=MyModel)
def print_name(sender, instance, **kwargs):
    print '%s' % instance.name