2012-06-05 17 views
7

Estoy tratando de definir un método "before_save" en ciertas clases en mi proyecto django 1.2. Tengo problemas para conectar la señal al método de clase en models.py.Django 1.2: Cómo conectar la señal pre_save al método de clase

class MyClass(models.Model): 
    .... 
    def before_save(self, sender, instance, *args, **kwargs): 
     self.test_field = "It worked" 

He intentado poner pre_save.connect (before_save, remitente = 'auto') en 'MiClase' sí, pero no pasa nada.

También he intentado ponerlo en la parte inferior del archivo models.py:

pre_save.connect(MyClass.before_save, sender=MyClass) 

leí sobre la conexión de señales a métodos de clase here, pero no se puede averiguar el código.

¿Alguien sabe lo que estoy haciendo mal?

Respuesta

-2

En lugar de usar un método en MyClass, solo debe usar una función. Algo así como:

def before_save(sender, instance, *args, **kwargs): 
    instance.test_field = "It worked" 

pre_save.connect(before_save, sender=MyClass) 
+3

Por favor, no lo recomiendo La razón para usar un método de clase es que mantiene el código mucho más limpio y mejor organizado, especialmente si el método solo se relaciona con la clase y sus datos. – Cerin

+0

Si el método solo se relaciona con la clase y sus datos, creo que es mejor anular el método de guardar en su lugar. –

7

Un ejemplo de trabajo con classmethod:

class MyClass(models.Model): 
    #.... 
    @classmethod 
    def before_save(cls, sender, instance, *args, **kwargs): 
     instance.test_field = "It worked" 

pre_save.connect(MyClass.before_save, sender=MyClass) 

También hay un gran decorador para manejar las conexiones de señal de forma automática: http://djangosnippets.org/snippets/2124/

3

Sé que esta pregunta es viejo, pero yo estaba buscando una respuesta a esto hoy temprano, ¿por qué no? Parece de su código que realmente quería usar un método de instancia (del self y la asignación de campo). DataGreed se dirigió a cómo usarlo para un método de clase, y el uso de señales con métodos de instancia es bastante similar.

class MyClass(models.Model) 

    test_field = models.Charfield(max_length=100) 

    def __init__(self, *args, **kwargs): 
     super(MyClass, self).__init__(*args, **kwargs) 
     pre_save.connect(self.before_save, sender=MyClass) 

    def before_save(self, sender, instance, *args, **kwargs): 
     self.test_field = "It worked" 

No estoy seguro de si esto es una buena idea o no, pero era útil cuando necesitaba un método de instancia llamada en un objeto de clase A antes de salvar de la clase B.

Cuestiones relacionadas