Question

J'ai une fonction:

def create(sender, **kw):
  [...]

Qui doit être appelé lorsque le signal user_activated de Django est appelé.

Je connecte le signal et la fonction en utilisant ceci:

from registration.signals import user_activated
[...]
post_save.connect(create, sender=user_activated, dispatch_uid="users-atactivation-signal")

Mais la fonction n'est pas appelée lorsqu'un utilisateur clique sur le lien d'activation, qu'il a obtenu par e-mail.

Qu'est-ce qui me manque ici.

Était-ce utile?

La solution

Une fonction comme ceci:

def create(sender, user, request, **kwarg):
[...]

Et un appel de connexion comme ceci:

user_activated.connect(create)

Fait le travail. Je les ai dans mon fichier Signals.py.

Autres conseils

Si l'application Django d'enregistrement n'était pas réellement installée, mais plutôt copiée dans un projet, votre code qui écoute les signaux ne sera pas appelé correctement.

De l'enregistrement Django v0.8 Documentation:

J'ai des fonctions à écouter les signaux d'enregistrement / d'activation, mais ils ne sont pas appelés!

La cause la plus courante de ceci est de placer le django-inscription dans un sous-répertoire qui se trouve sur votre chemin d'importation Python, plutôt que de l'installer directement sur le chemin d'importation comme d'habitude. L'importation de l'enregistrement Django dans ce cas peut entraîner divers problèmes, notamment en connectant mal les gestionnaires de signaux. Par exemple, si vous deviez placer le Django-Enregistrement dans un répertoire nommé Django_Apps, et vous référez-vous de cette manière, vous vous retrouveriez avec une situation où votre code fait cela:

from django_apps.registration.signals import user_registered

Mais l'enregistrement Django fera:

from registration.signals import user_registered

Du point de vue de Python, ces instructions d'importation se réfèrent à deux objets différents dans deux modules différents, et donc les gestionnaires de signaux connectés au signal de la première importation ne seront pas appelés lorsque le signal est envoyé en utilisant la deuxième importation.

Pour éviter ce problème, suivez la pratique standard de l'installation d'enregistrement Django directement sur votre chemin d'importation et faites-y toujours par son propre nom de module: Enregistrement (et en général, il est toujours une bonne idée de suivre les pratiques normales de Python pour l'installation et en utilisant des applications Django).

user_activated est lui-même un signal. Vous devez donc vous envoyer, avec des paramètres. Il nécessite 2 arguments en dehors de l'expéditeur, c'est-à-dire l'utilisateur, de la demande

user_activated.send(sender=Foo, user=request.user, request=request)

Foo est la classe backend utilisée pour activer l'utilisateur.

Le code qui connecte la méthode de manutention du signal à ce signal est-il définitivement chargé? (Vous pouvez tester avec une déclaration d'impression immédiatement après). Vous pouvez vous assurer de charger vos gestionnaires de signaux pour une application donnée en les important de cette application __init__.py:

from nameofapp.nameoffilewithhandlersinit import *

Ps. Est-ce une faute de frappe dans Dispatch_Uid, ou un nom délibéré?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top