Esto se añadió a la documentation cuando Django 1.7 fue puesto en libertad:
En sentido estricto, el manejo de señales y el código de registro pueden vivir en cualquier lugar que te gusta, aunque se recomienda evitar el módulo raíz de la aplicación y sus modelos módulo para minimizar los efectos secundarios de la importación de código.
En la práctica, los controladores de señal se suelen definir en un submódulo de señales de la aplicación a la que se refieren. Los receptores de señal están conectados en el método ready() de la clase de configuración de la aplicación. Si está utilizando el decorador de receptor(), simplemente importe el submódulo de señales dentro de listo().
Modificado en Django 1.7: Como ready() no existía en las versiones anteriores de Django, el registro de la señal generalmente ocurría en el módulo de modelos.
La mejor práctica es definir sus controladores en handlers.py en un submódulo de señales, p. un archivo que se parece a:
yourapp/señales/handlers.py:
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
El mejor lugar para registrar su manejador de la señal es entonces en la AppConfig de la aplicación que lo define, mediante el ready() método. Esto se verá así:
yourapp/apps.py:
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers #noqa
Asegúrese de que está cargando su AppConfig especificando que sea directamente en INSTALLED_APPS de su settings.py, o en el de __init__
tu aplicación Consulte see the ready() documentation para obtener más información.
Nota: Si va a proporcionar señales para otras aplicaciones a escuchar también, así, los pusieron en la __init__
en su módulo de señales, por ejemplo, un archivo que se parece a:
yourapp/señales/__ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Otra aplicación puede entonces escuchar su señal mediante la importación y registrarlo, por ejemplo, from yourapp.signals import task_generate_pre_save
. Separar las señales de sus manejadores mantiene las cosas limpias.
Instrucciones de Django 1.6:
Si todavía está atascado en Django 1.6 o inferior, a continuación, usted haría lo mismo (definir sus manipuladores en yourapp/señales/handlers.py), sino que usar AppConfig, cargaría los manejadores a través del __init__.py de su aplicación, por ejemplo algo así como:
yourapp/__ init__.py
import signals
Esto no es tan agradable como por el método de lista(), ya que a menudo causa problemas de importación circulares.
Me gusta eso. ¡Gracias! –
¿Y dónde suele conectar controladores a las señales? – DataGreed
@DataGreed: en la parte inferior de los modelos correspondientes.py. –