Isso foi adicionado à documentação quando o Django 1.7 foi lançado:
Estritamente falando, o código de manipulação e registro de sinal pode viver em qualquer lugar que você quiser, embora seja recomendável evitar o módulo raiz do aplicativo e o módulo de modelos para minimizar os efeitos colaterais da importação de código.
Na prática, os manipuladores de sinais são geralmente definidos em um submódulo de sinais do aplicativo ao qual se relacionam. Os receptores de sinal são conectados no método ready () da sua classe de configuração do aplicativo. Se você estiver usando o decorador receiver (), basta importar o submódulo de sinais para ready ().
Alterado no Django 1.7: Como o ready () não existia nas versões anteriores do Django, o registro do sinal geralmente acontecia no módulo de modelos.
A melhor prática é definir seus manipuladores em handlers.py em um submódulo de sinais, por exemplo, um arquivo parecido com:
yourapp / signs / 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
O melhor lugar para registrar seu manipulador de sinal é o AppConfig do aplicativo que o define, usando o método ready () . Isso ficará assim:
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
Verifique se você está carregando o AppConfig, especificando-o diretamente em INSTALLED_APPS do settings.py ou no __init__
aplicativo. Veja a documentação ready () para mais informações.
Nota: Se você estiver fornecendo sinais para outros aplicativos também ouvirem, coloque-os __init__
no módulo de sinais, por exemplo, um arquivo parecido com:
yourapp / signs / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Outro aplicativo pode ouvir seu sinal importando e registrando-o, por exemplo from yourapp.signals import task_generate_pre_save
. Separar os sinais dos manipuladores mantém as coisas limpas.
Instruções para o Django 1.6:
Se você ainda está preso no Django 1.6 ou inferior, faça o mesmo (defina seus manipuladores em yourapp / signs / handlers.py), mas em vez de usar o AppConfig, carregue os manipuladores através do __init__.py de seu aplicativo, por exemplo, algo como:
yourapp / __ init__.py
import signals
Isso não é tão bom quanto usar o método ready () porque geralmente causa problemas de importação circular.