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, как это описано в документации это уже обеспечит базовую модель с некоторыми полями и менеджером, который можно использовать для создания пользователей с хэшированным паролем.