Cela a été ajouté à la documentation lors de la sortie de Django 1.7 :
À proprement parler, la gestion du signal et le code d'enregistrement peuvent vivre où vous le souhaitez, bien qu'il soit recommandé d'éviter le module racine de l'application et son module de modèles pour minimiser les effets secondaires de l'importation de code.
En pratique, les gestionnaires de signaux sont généralement définis dans un sous-module de signaux de l'application à laquelle ils se rapportent. Les récepteurs de signaux sont connectés dans la méthode ready () de la classe de configuration de votre application. Si vous utilisez le décorateur receiver (), importez simplement le sous-module signaux dans ready ().
Modifié dans Django 1.7: Puisque ready () n'existait pas dans les versions précédentes de Django, l'enregistrement du signal se produisait généralement dans le module models.
La meilleure pratique consiste à définir vos gestionnaires dans handlers.py dans un sous-module de signaux, par exemple un fichier qui ressemble à:
yourapp / signaux / 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
Le meilleur endroit pour enregistrer votre gestionnaire de signaux est alors dans l'AppConfig de l'application qui le définit, en utilisant la méthode ready () . Cela ressemblera à ceci:
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
Assurez-vous que vous chargez votre AppConfig en le spécifiant soit directement dans votre INSTALLED_APPS settings.py, soit dans le __init__
de votre application. Voir la documentation ready () pour plus d'informations.
Remarque: si vous fournissez également des signaux à d'autres applications pour les écouter, placez-les __init__
dans votre module de signaux, par exemple un fichier qui ressemble à:
votreapp / signaux / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Une autre application peut alors écouter votre signal en l'important et en l'enregistrant, par exemple from yourapp.signals import task_generate_pre_save
. Séparer vos signaux de vos gestionnaires permet de garder les choses propres.
Instructions pour Django 1.6:
Si vous êtes toujours bloqué sur Django 1.6 ou une version antérieure, vous feriez la même chose (définissez vos gestionnaires dans votre application / signaux / handlers.py) mais plutôt que d'utiliser AppConfig, vous chargeriez les gestionnaires via le __init__.py de votre application, par exemple quelque chose comme:
votreapp / __ init__.py
import signals
Ce n'est pas aussi agréable que d'utiliser la méthode ready () car cela provoque souvent des problèmes d'importation circulaire.