Отправьте подтверждение по электронной почте при изменении адреса электронной почты в Django - PullRequest
2 голосов
/ 20 марта 2012

Я сейчас использую django-registration, и он работает хорошо (с некоторыми хитростями).Когда пользователь регистрируется, он должен проверить свою почту и щелкнуть ссылку активации.Это хорошо, но ...

Что если пользователь изменит адрес электронной почты?Я хотел бы отправить ему / ей электронное письмо, чтобы подтвердить, что он является владельцем адреса электронной почты ...

Есть ли приложение, фрагмент или что-то , которое сэкономило бы мне времянаписать это сам ?

1 Ответ

4 голосов
/ 22 июля 2013

Я недавно столкнулся с той же проблемой.И мне не понравилась идея иметь другое приложение / плагин только для этого.

Этого можно добиться, прослушивая синглы User модели (pre_save, post_save) и используя RegistrationProfile:

signal.py:

from django.contrib.sites.models import Site, RequestSite
from django.contrib.auth.models import User
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from registration.models import RegistrationProfile


# Check if email change
@receiver(pre_save,sender=User)
def pre_check_email(sender, instance, **kw):
    if instance.id:
        _old_email = instance._old_email = sender.objects.get(id=instance.id).email
        if _old_email != instance.email:
            instance.is_active = False

@receiver(post_save,sender=User)
def post_check_email(sender, instance, created, **kw):
    if not created:
        _old_email = getattr(instance, '_old_email', None)
        if instance.email != _old_email:
            # remove registration profile
            try:
                old_profile = RegistrationProfile.objects.get(user=instance)
                old_profile.delete()
            except:
                pass

            # create registration profile
            new_profile = RegistrationProfile.objects.create_profile(instance)

            # send activation email
            if Site._meta.installed:
                site = Site.objects.get_current()
            else:
                site = RequestSite(request)
            new_profile.send_activation_email(site) 

Таким образом, всякий раз, когда электронное письмо User изменяется, пользователь будет деактивирован, и пользователю будет отправлено электронное письмо для активации.

...