sch*_*cki 6 email django django-allauth
我使用普通的django-allauth没有任何社交帐户.每个用户应该只有一个与其帐户关联的电子邮件地址,即用于注册/验证的电子邮件地址.我想让我的用户更改此电子邮件.
所以我的第一个问题是,我是否应该通过发送验证电子邮件再次验证新电子邮件?我的直觉是,我最好通过这封新电子邮件进行验证.但我没有真正的论据.
我的第二个问题是,如果想要验证,那个过程是否已经用django-allauth支持?我见过EmailView和AddEmailForm.但这些假设是基于一个帐户可以拥有多个电子邮件地址的假设(这不是我想要的).
谢谢
eva*_*van 11
我认为应该验证新的电子邮件地址.如果您的应用程序定期发送电子邮件,您不希望将大量电子邮件发送到用户输入的任何电子邮件地址.
我所做的是允许多个电子邮件地址,直到验证第二封电子邮件.然后,听听django-allauth的email_confirmed信号,就像elssar所说的那样.验证地址后,立即将新电子邮件地址设置为主电子邮件,然后删除之前的任何地址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()
Run Code Online (Sandbox Code Playgroud)
观点:
def update_user_details(request):
user = request.user
new_email = request.POST.get('new_email')
user.custom_user.add_email_address(request, new_email)
...
Run Code Online (Sandbox Code Playgroud)
您可以通过几种方法来做到这一点。
要么监听email_confirmed信号处理程序,并有一个函数检查用户是否有两个EmailAccount对象与其帐户关联,如果有,则删除另一个EmailAccount对象。
另一个将被设置EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL,并EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL在您的设置和相关视图中删除额外的电子邮件地址(如果存在)。
另一种方法是覆盖EmailView和/或AddEmailForm并让他们做你想做的事。
对于在没有确认的情况下更改电子邮件,您可以让您的视图调用该EmailAddress.change方法。
| 归档时间: |
|
| 查看次数: |
3619 次 |
| 最近记录: |