Как добавить поля email и имя в SendMail при создании пользователя в Django
Я сделал сигнал, который запускает SendMail, когда я создаю пользователя. Только суперпользователи могут создавать пользователей с сайта Admin, пользователи не могут регистрироваться сами. Это важно для меня. Итак, сигнал работает хорошо, и когда я создаю нового пользователя, он отправляет письмо.
Моя проблема в том, что в Django Admin, когда я создаю пользователя, я не могу добавить адрес электронной почты и имя и фамилию, пока не сохраню пользователя. Но когда я сохраняю пользователя, он отправляет письмо без указанных полей, потому что в этот момент они пустые.
Как я могу сделать так, чтобы сигнал ждал второго сохранения или изменения, когда я заполняю поля email и имя?
models.py
class Profile(models.Model):
def __str__(self):
return str(self.user)
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
date = models.DateField(auto_now_add=True, auto_now=False, blank=True)
...
"""I extended the User model with a Profile"""
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
"""and here is the mail sending signal"""
@receiver(post_save, sender=User)
def send_new_user_data_email(sender, instance, created, **kwargs):
# if a new user is created, compose and send the email
if created:
username = instance.username
subject = 'Subject line'
message = 'User: {0}\nPassword: ... \nblablabla'.format(username)
send_mail(
subject,
message,
'example@example.com',
['recipeint1@xample.com', 'recipent2@xample.com ', '{0}'],
fail_silently=False,
)
Вы можете получить доступ к полям из сохраненного экземпляра:
@receiver(post_save, sender=User)
def send_new_user_data_email(sender, instance, created, **kwargs):
if created:
username = instance.username
subject = 'Subject line'
message = f'User: {instance.username}\nPassword: ... \nblablabla'
send_mail(
subject,
message,
None,
[instance.email],
fail_silently=False,
)
На самом деле вам не нужно сначала сохранять экземпляр, вы можете отправить письмо перед сохранением его в базе данных:
from django.db.models.signals import pre_save
@receiver(pre_save, sender=User)
def send_new_user_data_email(sender, instance, created, **kwargs):
# …
pass
Поле email
во встроенной модели пользователя Django не является обязательным (оно имеет blank=True
), поэтому возможно, что пользователь создается без адреса электронной почты. Если вы хотите изменить это, вам следует внести небольшие изменения в форму, используемую ModelAdmin
для этой User
модели.