2012-03-19 122 views
2

我目前使用django-registration,它運行良好(有一些技巧)。當用戶註冊時,他必須檢查他/她的郵件並點擊激活鏈接。這很好,但...更改Django中的電子郵件時發送確認電子郵件

如果用戶更改電子郵件會怎麼樣?我想給他/她發一封電子郵件,以確認他是電子郵件地址的所有者...

是否有一個應用程序,代碼段或什麼的這將節省我寫它的時間我自己

+0

試試這些? http://stackoverflow.com/questions/2296846/django-apps-for-changing-user-email-with-verification – CppLearner 2012-03-20 00:05:32

+1

如果沒有這項工作,我的意思是調整兩個應用程序一起工作的時間可能花在編寫一個讀取哈希驗證代碼的小視圖,並在用戶模型類中添加一個名爲「驗證」的狀態字段。在驗證完成之前,用戶被鎖定。 – CppLearner 2012-03-20 00:07:16

回答

4

我最近面臨同樣的問題。而且我不喜歡爲此提供另一個應用/插件的想法。

您可以做到這一點,聽User模型單打(pre_savepost_save),並使用RegistrationProfile

signals.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的電子郵件是更改後,用戶將被停用,激活電子郵件將發送給用戶。

+0

對於'post_save',你是否需要傳遞請求或者其他的? – fpghost 2014-02-28 12:52:31

+0

這可能是一個缺陷,如果用戶錯誤地更新他們的電子郵件地址到一個不正確的地址,然後沒有收到電子郵件,他們將被鎖定? – fpghost 2014-02-28 13:03:02

+0

不喜歡讓用戶帳戶處於非活動狀態的想法 – 2016-02-15 12:14:45