Esto se agregó a la documentación cuando se lanzó Django 1.7 :
Estrictamente hablando, el código de registro y manejo de señal puede vivir en cualquier lugar que desee, aunque se recomienda evitar el módulo raíz de la aplicación y su módulo de modelos para minimizar los efectos secundarios de la importación de código.
En la práctica, los manejadores de señales generalmente se definen en un submódulo de señales de la aplicación con la que se relacionan. Los receptores de señal se conectan en el método ready () de la clase de configuración de su aplicación. Si está utilizando el decorador de receptor (), simplemente importe el submódulo de señales dentro de ready ().
Cambiado en Django 1.7: Dado que ready () no existía en 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, por ejemplo, un archivo que se vea así:
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 señal es en el AppConfig de la aplicación que lo define, utilizando el método ready () . 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 especificándolo directamente en INSTALLED_APPS de settings.py, o en el __init__
de su aplicación. Consulte la documentación de ready () para obtener más información.
Nota: Si también proporciona señales para que otras aplicaciones también escuchen, colóquelas en el __init__
módulo de señales, por ejemplo, un archivo que se vea así:
yourapp / señales / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Luego, otra aplicación puede escuchar su señal importándola y registrándola, por ejemplo from yourapp.signals import task_generate_pre_save
. Separar sus señales de sus manejadores mantiene las cosas limpias.
Instrucciones para Django 1.6:
Si todavía está atascado en Django 1.6 o inferior, entonces haría lo mismo (defina sus controladores en yourapp / signal / handlers.py) pero en lugar de usar AppConfig, cargaría los controladores a través de __init__.py de su aplicación, por ejemplo, algo como:
yourapp / __ init__.py
import signals
Esto no es tan bueno como usar el método ready () porque a menudo causa problemas de importación circular.