更改用户电子邮件地址

6
我希望允许用户更改他的电子邮件地址。 用户将更改他的电子邮件地址,然后会向该地址发送一封确认电子邮件,并附有一个链接。 用户单击链接后,它将在数据库中更改他的电子邮件地址。
我知道django-generic-confirmation可以处理此类确认,但我想自己尝试解决问题。
要更改电子邮件,我的代码将是:
User.objects.get(username=username).update(email=request.POST['email'])

要向该地址发送电子邮件,我需要:

if 'Change Email' in request.POST.values():
    from django.core.mail import send_mail
    send_mail(
          'Confirm email change',
          'Click this **link** to confirm your change of email',
          'from@example.com',
          [request.POST['email']]
     )

我该如何延迟在数据库中更改电子邮件,直到用户确认了他的电子邮件?我该如何创建一个链接来激活这个过程的电子邮件?谢谢。

User.objects.get(username=username).update(email=request.POST['email']) 应该改为 User.objects.filter(username=username).update(email=request.POST['email'])。此外,直接从 POST 请求中获取电子邮件地址可能不是一个好主意 - 没有验证可能会在以后给你带来麻烦。 - Tomasz Zieliński
2个回答

7
这很简单。您需要编写一个至少包含以下模型的应用程序;
class EmailChangeAuth(models.Model):
    auth_key = models.CharField(max_length=42)
    user = models.ForeignKey(User)
    new_email = models.CharField(max_length=256)

将auth_key设置为UUID4,您可以像对待urlconf中的slug字段一样对待它。

然后编写视图,以auth_key作为参数,在数据库中搜索它,并将用户的电子邮件更改为new_email。完成后删除记录。

如果想获得额外的积分,则可以添加有效期,并定期清除一天前的所有记录。

您可能还需要考虑一个安全问题类型系统。因为许多人想要更改电子邮件的主要原因是旧邮件不存在了。例如离开公司、邮件主机消失(现在已经不太常见了)等等。


最好使用UUID字段 auth_key = models.UUIDField(default=uuid.uuid4, unique=True) - Josh

-2
如何延迟在数据库中更改电子邮件,直到用户确认了他的电子邮件?
这似乎很愚蠢。您应该等待用户确认电子邮件。也许这不是您真正想问的问题。
那么,如何创建一个链接来激活此过程的电子邮件呢?
这似乎没有多少意义。您可能是在询问如何填写“**link**”。
如果是这样,那么Django的reverse()函数就是为此而生的。
1. 为此编写一个视图函数。 2. 选择一个合理的URL路径用于视图函数。 3. 使用reverse生成完整的URL,然后将其插入电子邮件中。

通过延迟电子邮件更改,我是指如何编写一个带有此“触发器”的函数。例如,在上面的示例中,我将在请求.POST“触发器”上进行更改。我应该如何编写一个函数来响应单击电子邮件的触发事件? - David542
@David542:该电子邮件包含一个链接。点击链接后会出现一个页面,这是一个GET请求。当用户阅读电子邮件并点击其中的链接时,就会发生这种情况。您是否曾经使用过需要通过电子邮件进行确认的网站?请现在尝试一下,并查看电子邮件消息HTML中的链接,请选择“查看源代码”。 - S.Lott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接