Вопрос

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

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 или преднамеренное имя?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top