Pergunta

Eu tenho uma função:

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

Que devem ser chamados quando o sinal usuário de registro de Django for chamado.

Eu conecto o sinal e a função usando isso:

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

Mas a função não é chamada quando um usuário clica no link de ativação, que recebeu por e -mail.

O que eu sinto falta aqui.

Foi útil?

Solução

Uma função como esta:

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

E uma chamada de conexão assim:

user_activated.connect(create)

faz o trabalho. Eu tenho isso no meu arquivo sinals.py.

Outras dicas

Se o aplicativo de registro django não foi realmente instalado, mas apenas copiou um projeto, seu código que ouve sinais não será chamado corretamente.

Do Django-Registration v0.8 documentação:

Eu tenho funções ouvindo os sinais de registro/ativação, mas eles não estão sendo chamados!

A causa mais comum disso é colocar o registro de django em um subdiretório que está no caminho de importação do Python, em vez de instalá-lo diretamente no caminho de importação normalmente. A importação do registro de Django nesse caso pode causar vários problemas, incluindo a conexão incorreta dos manipuladores de sinal. Por exemplo, se você colocasse o registro de django dentro de um diretório chamado django_apps e se referisse dessa maneira, acabaria com uma situação em que seu código faz isso:

from django_apps.registration.signals import user_registered

Mas o registro de django estará fazendo:

from registration.signals import user_registered

Do ponto de vista do Python, essas instruções de importação se referem a dois objetos diferentes em dois módulos diferentes e, portanto, os manipuladores de sinal conectados ao sinal da primeira importação não serão chamados quando o sinal for enviado usando a segunda importação.

Para evitar esse problema, siga a prática padrão de instalar o registro de django diretamente no seu caminho de importação e sempre se referir a ele por seu próprio nome do módulo: registro (e, em geral, é sempre uma boa idéia seguir as práticas normais do Python para instalar e usando aplicativos django).

user_activated é em si é um sinal. Então você tem que se enviar, com parâmetros. Requer 2 argumentos além do remetente, ou seja, usuário, solicitação

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

Foo é a classe de back -end usada para ativar o usuário.

O código que conecta o método de manipulação de sinal está definitivamente sendo carregado? (Você pode testar com uma declaração de impressão imediatamente após ela). Você pode carregar seus manipuladores de sinal para um determinado aplicativo importando -os do aplicativo __init__.py:

from nameofapp.nameoffilewithhandlersinit import *

Ps. Isso é um erro de digitação no despacho_uid ou um nome deliberado?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top