Dica 27 - Signals
PreviousDica 26 - Paginação e BreadcrumbNextDica 28 - Gerando dados aleatórios com Faker - faker-commerce
Last updated
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.PROTECT,
verbose_name='usuário'
)
birthday = models.DateField('data de nascimento', null=True, blank=True)
linkedin = models.URLField(null=True, blank=True)
rg = models.CharField(max_length=10, null=True, blank=True)
cpf = models.CharField(max_length=11, null=True, blank=True)from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()python manage.py shell_plusfrom django.contrib.auth import get_user_model
User = get_user_model()
User # aqui nós vemos que o nosso User está em backend.accounts.models.Userinstance = User.objects.create()# pre_save -> instance
instance = User.objects.create()
# post_save -> instance, created=True# pre_save -> instance
instance.save()
# post_save -> instance, created=False# accounts/models.py
from django.db.models.signals import post_save
from django.dispatch import receiver
def user_created_handler(*args, **kwargs):
print('Usuário criado com sucesso.')
post_save.connect(user_created_handler, sender=User)@receiver(post_save, sender=User)
def user_created_handler(*args, **kwargs):
print('Usuário criado com sucesso.')
print(args, kwargs)from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.create_user(email='user01@email.com')
() {'signal': <django.db.models.signals.ModelSignal object at 0x7fa6a116b490>, 'sender': <class 'backend.accounts.models.User'>, 'instance': <User: user01@email.com>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}'instance': <User: user01@email.com>, 'created': True@receiver(post_save, sender=User)
def user_created_handler(sender, instance, created, *args, **kwargs):
print('Usuário criado com sucesso.')
# print(args, kwargs)
if created:
print('Envia e-mail para', instance.email)
else:
print(instance.email, 'foi salvo.')@receiver(pre_save, sender=User)
def user_pre_save_handler(sender, instance, *args, **kwargs):
print(instance.email, instance.id) # None
# NÃO FAÇA ISSO -> instance.save() # Loop infinito# accounts/models.py
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()# accounts/models.py
@receiver(post_save, sender=User)
def send_email_on_user_creation(sender, instance, created, **kwargs):
if created:
send_mail(
'New user created',
f'A new user with email {instance.email} has been created.',
'from@example.com',
['to@example.com'],
fail_silently=False,
)# product/models.py
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.utils.text import slugify
class Product(TimeStampedModel):
...
slug = models.SlugField(blank=True, null=True)
@receiver(pre_save, sender=Product)
def product_pre_save(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = slugify(instance.title)touch backend/product/signals.py# product/signals.py
from django.utils.text import slugify
def product_pre_save(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = slugify(instance.title)# product/apps.py
class ProductConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myproject.product'
def ready(self):
from django.db.models.signals import pre_save
from .models import Product
from .signals import product_pre_save
pre_save.connect(product_pre_save, sender=Product)# product/admin.py
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
...
list_display = ('__str__', 'slug', 'category')
readonly_fields = ('slug',)
...