Frage

Ich habe eine Funktion:

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

Dies sollte aufgerufen werden, wenn das user_activierte Signal von Django-Registrierung aufgerufen wird.

Ich verbinde das Signal und die Funktion mit diesem:

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

Die Funktion wird jedoch nicht aufgerufen, wenn ein Benutzer auf den Aktivierungslink klickt, den er per E -Mail erhalten hat.

Was vermisse ich hier?

War es hilfreich?

Lösung

Eine Funktion wie diese:

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

und ein Connect -Anruf wie diesen:

user_activated.connect(create)

macht den Job. Ich habe diese in meiner Datei signals.py.

Andere Tipps

Wenn die Django-Registrierungs-App nicht installiert wurde, sondern gerade in ein Projekt kopiert wurde, wird Ihr Code, das auf Signale hört, nicht ordnungsgemäß aufgerufen.

Aus der Django-Registrierung v0.8 Dokumentation:

Ich habe Funktionen, die auf die Registrierungs-/Aktivierungssignale hören, aber sie werden nicht angerufen!

Die häufigste Ursache dafür ist die Einstellung der Django-Registrierung in ein Unterabschluss, das sich auf Ihrem Python-Importpfad befindet, anstatt ihn wie gewohnt direkt auf den Importpfad zu installieren. Das Import von Django-Registrierung in diesem Fall kann zu verschiedenen Problemen führen, einschließlich falscher Verbindungssignalhandler. Wenn Sie beispielsweise die Django-Registrierung in ein Verzeichnis namens Django_Apps platzieren und auf diese Weise verweisen würden, würden Sie eine Situation haben, in der Ihr Code dies tut:

from django_apps.registration.signals import user_registered

Aber Django-Registrierung wird:

from registration.signals import user_registered

Aus Pythons Sicht beziehen sich diese Importanweisungen auf zwei verschiedene Objekte in zwei verschiedenen Modulen, und so werden Signalhandler aus dem ersten Einfuhr nicht aufgerufen, wenn das Signal unter Verwendung des zweiten Imports gesendet wird.

Um dieses Problem zu vermeiden, befolgen Sie die Standardpraxis der Installation von Django-Registrierung direkt auf Ihrem Importpfad und beziehen Verwenden von Django -Anwendungen).

user_activated ist selbst ein Signal. Sie müssen sich also mit Parametern selbst senden. Abgesehen von dem Absender, dem Benutzer, benötigen Sie 2 Argumente

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

Foo Ist die Backend -Klasse, mit der der Benutzer aktiviert wird.

Wird der Code, der die Signalhandhabungsmethode mit diesem Signal verbindet, definitiv geladen? (Sie können sofort danach mit einer Print -Statement testen). Sie können sicherstellen, dass Sie Ihre Signalhandler für eine bestimmte App laden, indem Sie sie aus der App importieren __init__.py:

from nameofapp.nameoffilewithhandlersinit import *

Ps. Ist das ein Tippfehler in der SIPTE_UID oder ein absichtlicher Name?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top