2011-08-09 11 views
14

Próbuję stworzyć system, który umożliwia użytkownikowi załadowanie pliku zip, a następnie wyodrębnić go za pomocą sygnału post_save.sygnały django, jak używać "instancji"

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 metoda działa dobrze, gdy są poprawne ścieżki plików (w tym przypadku muszę dostarczyć instance.file_zip.path. Jednak nie mogłem/set wystąpienie z sygnałami. Django dokumentację o sygnałach nie jest jasne .? i nie ma przykładów Więc co mam zrobić

Odpowiedz

19

Właściwie Django's documentation about signals jest bardzo jasne i nie zawiera przykłady

W twoim przypadku, sygnały post_save wysyła następujące argumenty:. sender (klasy modelu) instance (inst z klasy sender), created, raw i using. Jeśli chcesz mieć dostęp do instance, można uzyskać dostęp go za pomocą kwargs['instance'] W przykładzie lub lepiej zmienić funkcję zwrotną, aby zaakceptować argument:

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

Myślę, że chodzi o '** kwargs', którego jeszcze nie znam. Twój przykład działa dobrze, dziękuję. –

+0

@Ferdinand Nie ma przykładów na temat post_save w dokumentacji django. – Anuj

+0

@Anuj - Nigdy nie powiedziałem, że były jakieś przykłady dotyczące 'post_save'. Istnieją przykłady użycia sygnałów w ogóle, a te odnoszą się również do 'post_save', ponieważ nie ma nic szczególnego w tym konkretnym sygnale. –

1

ten pracował dla mnie podczas podłączania Django Signals:

Oto models.py:

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

A Signal, że dostęp do niego post_save:

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