Подключение сигнала Django-регистрации
-
26-09-2019 - |
Вопрос
У меня есть функция:
def create(sender, **kw):
[...]
Который следует вызывать, когда вызывается сигнал user_Axtivied от Django-регистрации.
Я подключаю сигнал и функцию, используя это:
from registration.signals import user_activated
[...]
post_save.connect(create, sender=user_activated, dispatch_uid="users-atactivation-signal")
Но функция не вызывается, когда пользователь нажимает на ссылку активации, которую он получил по электронной почте.
Что мне здесь пропустить.
Решение
Такая функция:
def create(sender, user, request, **kwarg):
[...]
и связь связи такая:
user_activated.connect(create)
делает работу. У меня есть это в моих сигналах .py файл.
Другие советы
Если приложение Django-регистрации на самом деле не было установлено, а скорее скорее скопировано в проект ваш код, который слушает сигналы, не звонит должным образом.
Из Django-регистрации v0.8 документация:
У меня есть функции, слушающие сигналы регистрации / активации, но они не вызывают!
Наиболее распространенной причиной этого является размещение Django-регистрации в подкаталоги, которое на вашем Python Path Import, а не устанавливает его непосредственно на путь импорта, как обычно. Импорт из Django-регистрации в этом случае может вызвать различные проблемы, в том числе неправильно соединяющие обработчики сигналов. Например, если вы должны были разместить Django-регистрацию в каталоге с именем Django_Apps, и обратитесь к нему таким образом, вы получите ситуацию, когда ваш код делает это:
from django_apps.registration.signals import user_registered
Но Django-регистрация будет делать:
from registration.signals import user_registered
Из точки зрения Python эти операторы импорта относятся к двум различным объектам в двух разных модулях, и поэтому обработчики сигналов, подключенные к сигналу от первого импорта, не будут вызываться, когда сигнал отправляется с использованием второго импорта.
Чтобы избежать этой проблемы, выполните стандартную практику установки Django-регистрации непосредственно на ваш путь импорта и всегда ссылаясь на него по своему имени собственного модуля: регистрация (и в целом, всегда хорошая идея следовать нормальной практике Python для установки и Использование приложений Django).
user_activated
сам является сигналом. Таким образом, вы должны отправить себе с параметрами. Это требует 2 аргументов, кроме отправителя, то есть пользователя, запрос
user_activated.send(sender=Foo, user=request.user, request=request)
Foo
это класс Backend используется для активации пользователя.
Является ли код, который соединяет метод обработки сигналов к этому сигналу, определенно загруженным? (Вы можете проверить с немедленно после нее тестировать печать. Вы можете убедиться, что вы загружаете обработчики сигналов для данного приложения, импортируя их из этого приложения __init__.py
:
from nameofapp.nameoffilewithhandlersinit import *
Придавать Это опечатка в Dispatch_uid или преднамеренное имя?