Django Оповещение по электронной почте после создания пользователя

Пользователь должен получать письмо, когда пользователь был создан, если кнопка post была нажата в Django rest framework и ниже приведен мой код. Я создаю API для этого проекта

ОШИБКА

AttributeError at /api/User/ У объекта 'User' нет атрибута 'is_active' Метод запроса: POST URL запроса: http://127.0.0.1:8000/api/User/. Версия Django: 2.2.12 Тип исключения: AttributeError Значение исключения:
У объекта 'User' нет атрибута 'is_active'

class User(models.Model):
    
    CHOICES= (
    ('manager','Manager'),
      ('hr', 'HR'),
     ('hr manager','HR Manager'),
     ('trainee','Trainee')
)

    firstname = models.CharField(max_length=210)
    lastname = models.CharField(max_length=210)
    dob=models.DateField(max_length=8) 
    email=models.EmailField(max_length=254,default=None) 
    password=models.CharField(max_length=100,default=None)
    joiningDate=models.DateTimeField(max_length=8)
    userrole=models.CharField(max_length=20,choices=CHOICES,null=True)

def __str__(self):
    return self.firstname 

@receiver(post_save, sender=User, dispatch_uid='active')
def active(sender, instance, **kwargs):
    if instance.is_active and User.objects.filter(pk=instance.pk, is_active=True).exists():
        subject = 'Active account'
        mesagge = '%s your account is now active' %(instance.username)
        from_email = settings.EMAIL_HOST_USER
        send_mail(subject, mesagge, from_email, [instance.email], fail_silently=True)

class Project(models.Model):
    name = models.CharField(max_length=20)
    description=models.TextField()
    type=models.TextField()
    startDate = models.DateTimeField(max_length=10)
    endDate=models.DateTimeField(max_length=10)
    user=models.ManyToManyField(User)
    
    def __str__(self):
        return self.name
    
    
class Timesheet(models.Model):
    project=models.ManyToManyField(Project)
    Submitted_by=models.ForeignKey(default=None,related_name="SubmittedBy",to='User',on_delete=models.CASCADE)
    status=models.CharField(max_length=200)
    ApprovedBy=models.ForeignKey(default=None,related_name="ApprovedBy",to='User',on_delete=models.CASCADE)
    Date=models.DateField()
    Hours=models.TimeField(null=True)

    def __str__(self):
        return self.id
    
    
class Client(models.Model):
    clientname=models.CharField(max_length=20)
    comapny=models.CharField(max_length=200)
    location=models.CharField(max_length=200)
    email=models.EmailField(max_length=25,default=None)
    
    
    def __str__(self):
        return self.clientname

В вашей пользовательской модели пользователя нет поля is_active, поэтому instance.is_active в качестве проверки не имеет особого смысла. Вы можете переписать проверку следующим образом:

@receiver(post_save, sender=User, dispatch_uid='active')
def active(sender, instance, **kwargs):
    if User.objects.filter(pk=instance.pk).exists():
        subject = 'Active account'
        mesagge = '%s your account is now active' %(instance.username)
        from_email = settings.EMAIL_HOST_USER
        send_mail(subject, mesagge, from_email, [instance.email], fail_silently=True)

Но и в этом нет особого смысла, поскольку для post_save мы знаем, что эта запись будет в базе данных. Вы можете проверить, создали ли вы элемент new с помощью параметра created:

@receiver(post_save, sender=User, dispatch_uid='active')
def active(sender, instance, created, **kwargs):
    if created:
        subject = 'Active account'
        mesagge = '%s your account is now active' %(instance.username)
        from_email = settings.EMAIL_HOST_USER
        send_mail(subject, mesagge, from_email, [instance.email], fail_silently=True)

Другой подход заключается в добавлении поля в модель пользователя:

class User(models.Model):
    # …,
    is_active = models.BooleanField(default=True)
    # …

Однако я бы посоветовал наследоваться от модели AbstractUser, как это описано в документации это уже обеспечит базовую модель с некоторыми полями и менеджером, который можно использовать для создания пользователей с хэшированным паролем.

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