2011-08-09 15 views
14

Estoy intentando crear un sistema que permita al usuario cargar un archivo zip, y luego extraerlo usando la señal post_save.señales de django, cómo usar "instancia"

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 método funciona bien cuando se proporcionan rutas de archivos correctos (en este caso, tengo que proporcionar instance.file_zip.path. Sin embargo, no pude obtener/establecer la instancia con las señales. Django documentación acerca de las señales no es clara .? y no tienen ejemplos Entonces, ¿qué hago

Respuesta

19

En realidad, Django's documentation about signals es muy clara y contiene ejemplos

En su caso, las señales post_save envía los siguientes argumentos:. sender (la clase del modelo), instance (el inst de clase sender), created, raw y using. Si necesita acceder a instance, se puede acceder a él mediante kwargs['instance'] en su ejemplo, o mejor, cambiar su función de devolución de llamada para aceptar el argumento:

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

creo que se trata de la '** kwargs' la que no sé todavía. Tu ejemplo funciona bien, gracias. –

+0

@Ferdinand No hay ejemplos sobre post_save en la documentación de django. – Anuj

+0

@Anuj - Nunca dije que hubiera ejemplos sobre 'post_save'. Hay ejemplos sobre cómo usar señales en general, y estos también se aplican a 'post_save', ya que no hay nada de especial en esta señal en particular. –

1

Esto funcionó para mí cuando se conecta Django Signals:

Aquí está la models.py:

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

Y la señal de que el acceso se post_save:

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