Dica 27 - Signals

Doc: https://docs.djangoproject.com/en/4.1/topics/signals/

https://docs.djangoproject.com/en/4.1/ref/signals/

Problema

Suponha que você queira enviar um e-mail de boas-vindas para um novo usuário.

Onde você faria isso? Na views?

E se você usasse mais views para fazer esse cadastro?

Você criaria uma função! Hum... pode ser.

Mas e se você cadastra-se um usuário pelo Admin?

Outra situação:

Suponha que você não tenha acesso ao model User.

Neste projeto nós temos acesso, mas no Django padrão nós não teríamos acesso.

Como você faria para, tanto na views, como no Admin, e até no shell do Django, saber se um model do User foi criado ou modificado?

Para isso nós temos o signals.

O que é um Signal?

No Django, os "signals" são uma forma de enviar sinais ou notificações quando ocorre uma determinada ação no banco de dados ou em algum modelo específico. Esses sinais podem ser usados para executar ações adicionais ou enviar notificações quando determinadas mudanças ocorrem no modelo.

Toda vez que um model é criado, ou alterado, é enviado um sinal para a aplicação. E este sinal pode fazer alguma coisa.

Exemplos

  • Ao criar um novo usuário, criar um Profile pra ele.

  • Ao criar um novo usuário, enviar um e-mail pra ele.

  • Ao criar um novo produto, definir um slug automaticamente.

Model Profile

Considere o model Profile.

Agora vamos considerar o seguinte:

Toda vez que eu criar um novo usuário, eu quero automaticamente criar um Profile pra ele.

Detalhando um pouco mais

No terminal digite

Depois

Exemplo 1

Se fizermos

Podemos ter os signals pre_save e post_save.

A diferença é que o pre_save tem o instance, e o post_save tem o instance e o created.

Note também que no pre_save você ainda não tem o id do objeto.

Exemplo 2

Neste outro exemplo, usando o comando save()

A diferença aqui é que em post_save o created=False.

Exemplo 3

Ao deletar temos os signals pre_delete e post_delete.

Exemplo 4

Agora vamos ao código

Ou podemos usar o decorator receiver.

Quando adicionarmos um novo usuário...

Veja o

Exemplo 5

Podemos acrescentar mais parâmetros como

Salve alguns usuários no Admin e veja o resultado no terminal.

Exemplo 6

Agora veremos o pre_save.

Teste pelo Admin.

Exemplo 7 - Profile

Agora já conseguimos entender o signal do Profile.

Exemplo 8 - Envio de e-mail

Model Product

Em Product vamos adicionar um slug.

Bonus: colocando o Signals num arquivo separado

Agora precisamos editar o arquivo apps.py.

Para finalizar vamos colocar o slug como read_only no Admin.

Last updated

Was this helpful?