сигналы django, как использовать «экземпляр» - PullRequest
15 голосов
/ 09 августа 2011

Я пытаюсь создать систему, которая позволяет пользователю загружать 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 ]

21 голосов
/ 09 августа 2011

На самом деле, Документация Джанго о сигналах очень ясна и содержит примеры.

В вашем случае сигналы post_save отправляют следующие аргументы: sender (класс модели), instance (экземпляр класса sender), created, raw и using.Если вам нужен доступ к instance, вы можете получить к нему доступ, используя kwargs['instance'] в вашем примере, или, лучше, изменить функцию обратного вызова, чтобы принять аргумент:

@receiver(post_save, sender=Project)
def unzip_and_process(sender, instance, created, raw, using, **kwargs):
    # Now *instance* is the instance you want
    # ...
1 голос
/ 10 января 2014

у меня сработало при подключении 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...