2013-11-03 91 views
4

我使用普通django-allauth沒有任何社會帳戶。每個用戶應該只有一個與他的賬戶相關的電子郵件地址,即用於註冊/驗證的電子郵件地址。我想讓我的用戶更改此電子郵件。django-allauth更改用戶電子郵件與/不驗證

所以我的第一個問題是,我是否應該通過發送驗證電子郵件再次驗證新電子郵件?我的直覺告訴我,我最好有這個新的電子郵件進行驗證。但我沒有真正的論據。

我的第二個問題是,如果要驗證,是否已經用django-allauth支持過程?我已經看到了EmailView和AddEmailForm。但這些都是基於一個帳戶可以有多個電子郵件地址(這不是我想要的)的假設。

謝謝

+0

看看在['EmailView'](https://github.com /pennersr/django-allauth/blob/master/allauth/account/views.py#L209)和['AddEmailForm'](https://github.com/pennersr/django-allauth/blob/master/allauth/account /forms.py#L277)。 – elssar

+0

謝謝elssar,只是更新了我的問題。 – schacki

回答

2

有幾種方法可以做到這一點。

要麼收聽email_confirmed信號處理程序,並且具有檢查用戶是否有兩個與其帳戶關聯的EmailAccount對象的功能,如果是,請刪除其他EmailAccount對象。

另一個會在您的設置中設置EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URLEMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL,並在相關視圖中刪除額外的電子郵件地址(如果存在)。

另一種方法是重寫EmailView和/或AddEmailForm,讓他們做你想做的事。

對於未經確認就更改電子郵件,您可以讓您的視圖調用EmailAddress.change方法。

7

我認爲應該驗證新的電子郵件地址。如果您的應用程序定期發送電子郵件,您不希望將大量電子郵件發送到用戶輸入的任何電子郵件地址。

我所做的是允許多個電子郵件地址,直到第二封電子郵件被驗證。然後,聽取eljar建議的django-allauth的email_confirmed信號。驗證地址後,請將新的電子郵件地址設置爲主要電子郵件地址,然後刪除以前的任何EmailAddess。下面是我最後做一個簡單的例子:

型號:

from django.dispatch import receiver 
from allauth.account.models import EmailAddress 
from allauth.account.signals import email_confirmed 

class CustomUser(models.Model): 
    ... 
    def add_email_address(self, request, new_email): 
     # Add a new email address for the user, and send email confirmation. 
     # Old email will remain the primary until the new one is confirmed. 
     return EmailAddress.objects.add_email(request, self.user, new_email, confirm=True) 

@receiver(email_confirmed) 
def update_user_email(sender, request, email_address, **kwargs): 
    # Once the email address is confirmed, make new email_address primary. 
    # This also sets user.email to the new email address. 
    # email_address is an instance of allauth.account.models.EmailAddress 
    email_address.set_as_primary() 
    # Get rid of old email addresses 
    stale_addresses = EmailAddress.objects.filter(
     user=email_address.user).exclude(primary=True).delete() 

觀點:

def update_user_details(request): 
    user = request.user 
    new_email = request.POST.get('new_email') 
    user.custom_user.add_email_address(request, new_email) 
    ...