Подключение django-регистрационного сигнала - PullRequest
3 голосов
/ 07 августа 2010

У меня есть функция:

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

, которая должна вызываться, когда вызывается сигнал user_activation от регистрации django.

Я подключаю сигнал и функцию, используя это:

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

Но эта функция не вызывается, когда пользователь нажимает на ссылку активации, которую он получил по электронной почте.

Что мне здесь не хватает.

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Функция, подобная этой:

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

и вызов подключения вот так:

user_activated.connect(create)

делает работу. У меня есть это в моем файле signal.py.

2 голосов
/ 25 ноября 2011

Если приложение регистрации django на самом деле не было установлено, а просто скопировано в проект, ваш код, который прослушивает сигналы, не будет вызываться правильно.

Из документации django v0.8 Документация :

У меня есть функции прослушивания сигналов регистрации / активации, но им не звонят!

Наиболее распространенной причиной этого является размещение django-регистрации в подкаталог, который находится на вашем пути импорта Python, а не установив его прямо на путь импорта, как обычно. Импорт из django-регистрация в таком случае может вызвать различные проблемы, в том числе неправильное подключение обработчиков сигналов. Например, если бы вы поместите django-регистрацию в каталог с именем django_apps и относитесь к этому таким образом, вы бы в конечном итоге оказались в ситуации, когда Ваш код делает это:

from django_apps.registration.signals import user_registered

Но django-регистрация будет делать:

from registration.signals import user_registered

С точки зрения Питона с точки зрения, эти операторы импорта относятся к двум различным объектам в двух различные модули, и поэтому обработчики сигнала, подключенные к сигналу от первый импорт не будет вызван при отправке сигнала с использованием второй импорт.

Чтобы избежать этой проблемы, следуйте стандартной практике установки Django-регистрация прямо на вашем пути импорта и всегда ссылаясь к нему по собственному имени модуля: регистрация (и вообще, это всегда хорошая идея следовать нормальным практикам Python для установки и с использованием приложений Django).

0 голосов
/ 07 августа 2010

Код, который связывает метод обработки сигнала с этим сигналом, определенно загружается? (Вы можете проверить печать с печатью сразу после нее). Вы можете убедиться, что загружаете свои обработчики сигналов для данного приложения, импортируя их из __init__.py:

этого приложения

from nameofapp.nameoffilewithhandlersinit import *

PS. это опечатка в dispatch_uid или преднамеренное имя?

0 голосов
/ 07 августа 2010

user_activated сам по себе является сигналом. Так что отправляй сам, с параметрами. Требуется 2 аргумента, кроме отправителя, то есть пользователя, запроса

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

Foo - это внутренний класс, используемый для активации пользователя.

...