Отправить электронное письмо, если пользователю Django изменен их активный статус
Я создал сайт, который требует членства для некоторых частей. Это клубный сайт, поэтому чтобы быть участником на сайте, вы должны быть участником в реальной жизни. План состоит в том, чтобы кто-нибудь из Клуба проверил наличие новых членов (вероятно, система отправит им электронное письмо, когда пользователь зарегистрируется), а затем администратор проверит active
Флажок под записью пользователя в админке Django и сохраняет пользователя.
Проблема, которую я пытаюсь преодолеть, заключается в том, что нам нужно, чтобы новые действительные пользователи были уведомлены о том, когда они могут начать использовать свою учетную запись. Очевидно, что отправка электронной почты вручную является обременительной.
Есть ли способ подключиться к save()
логика, проверьте, если запись active
состояние изменилось, и если оно было активировано, отправьте этому пользователю электронное письмо, сообщающее ему, что теперь он может войти?
Я на вершине всей логики электронной почты, мне просто нужно знать, где ее разместить.
Я понимаю, что есть и другие способы тестирования (проверьте last_login==None
на active==True
учетные записи в стиле cron), но я бы хотел, чтобы уведомления были почти мгновенными.
3 ответа
Хорошо, 5 лет спустя, но это работает для меня с django 1.8 и python 2.7
Контекст таков: пользователь создает новую учетную запись, затем администратор получает электронное письмо для проверки пользователя, и chage активен в True, когда администратор вносит изменения, а пользователь получает электронное письмо, сообщающее, что теперь он может войти.
Извините за мой плохой английский.
#forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
#A register form that save field is_active as False
class RegisterForm(UserCreationForm):
email = forms.EmailField(label=_("E-mail"))
first_name = forms.CharField(label=_("First Name"))
last_name = forms.CharField(label=_("Last Name"))
is_active = forms.BooleanField(required=False, initial=False, label=_("Activo"), widget=forms.HiddenInput())
class Meta:
model = User
fields = ('username','first_name','last_name','email','password1','password2','is_active')
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
user.is_active = self.cleaned_data['is_active']
if commit:
user.save()
return user
Я использую сигналы в файле models.py, но вы можете использовать его в файле signal.py
#models.py
from django.contrib.auth.models import User
from django.db.models import signals
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save
from django.conf import settings
from django.core.mail import send_mail
#signal used for is_active=False to is_active=True
@receiver(pre_save, sender=User, dispatch_uid='active')
def active(sender, instance, **kwargs):
if instance.is_active and User.objects.filter(pk=instance.pk, is_active=False).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=False)
#signal to send an email to the admin when a user creates a new account
@receiver(post_save, sender=User, dispatch_uid='register')
def register(sender, instance, **kwargs):
if kwargs.get('created', False):
subject = 'Verificatión of the %s account' %(instance.username)
mesagge = 'here goes your message to the admin'
from_email = settings.EMAIL_HOST_USER
send_mail(subject, mesagge, from_email, [from_email], fail_silently=False)
Да, вам нужно использовать сигналы django, в частности post_save (). Это, как вы, наверное, догадались, get вызывается после сохранения вашей модели, и вы можете затем реализовать любые функции пост-сохранения (то есть пост-записи в базу данных), которые вам требуются.
Это не было проверено, но вот измененная версия чего-то похожего:
from django.contrib.auth.models import User
from django.db.models import signals
from django.conf import settings
from django.core.mail import send_mail
def pre_user_save(sender, instance, *args, **kwargs):
if instance.active != User.objects.get(id=instance.id).active:
send_mail(
subject='Active changed: %s -> %s' % (instance.username, instance.active),
message='Guess who changed active status??',
from_email=settings.SERVER_EMAIL,
recipient_list=[p[1] for p in settings.MANAGERS],
)
signals.pre_save.connect(pre_user_save, sender=User, dispatch_uid='pre_user_save')
Надеюсь это поможет!