Как добавить поля 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 модели.

Вернуться на верх