【问题标题】:django-allauth: How to set user to active only after e-mail verificationdjango-allauth:如何仅在电子邮件验证后将用户设置为活动状态
【发布时间】:2014-09-07 14:11:09
【问题描述】:

我主要将 django-allauth 用作为管理后端创建用户帐户的一种方式。我希望发生的是:

1)当用户完成注册程序时,发送验证电子邮件(我目前正在工作)并将用户设置为非活动,员工,并由分配给他们的“SurveyManager”组违约。目前,创建用户时将活动设置为 true,人员设置为 false,并且未分配任何组。

2) 单击他们电子邮件中的链接以验证其地址后,我希望将用户设置为活动状态,以便他们可以通过管理后端登录。

我的具体问题是我不知道:1)如何或在哪里设置用户的活动、员工和组的默认值——我想这将在 models.py 文件中完成,但它是我的理解是用户模型包含在 auth 应用程序中;以及 2) 一旦电子邮件验证完成,如何触发代码将用户活动标志更改为真。

提前致谢 -- 抱歉,如果这是一个糟糕的帖子,这是我的第一篇!

【问题讨论】:

  • 您还没有真正描述在尝试产生这些结果时遇到的特定编程问题。
  • 对不起——我的具体问题是我不知道:1)如何或在哪里设置活动、员工和用户组的默认值——我想这将在一个models.py 文件,但据我了解,用户模型包含在auth 应用程序中。 2) 邮件验证完成后如何触发代码将用户活动标志更改为真。

标签: django django-admin django-authentication django-allauth


【解决方案1】:

我知道这是一篇旧帖子,但我在自己的搜索中遇到了这个帖子。为了回复您的 email_confirmed 问题,请在您的 EmailAddress 实例调用中使用 email=kwargs['email_address'].email。

@receiver(email_confirmed)
def email_confirmed_(request, *args, **kwargs):
    user = request.user
    new_email_address = EmailAddress.objects.get(
        email=kwargs['email_address'].email)
    user = User.objects.get(
        email=new_email_address.user)
    user.is_active = True
    user.save()

【讨论】:

    【解决方案2】:

    我似乎(大部分)通过使用信号解决了我的问题。 This post 给了我这个想法(但不幸的是没有提供任何代码示例),而this site 给了我一些实际的具体示例来修改(我发现这是 Django 世界中的稀有商品)。

    我最终将以下代码放入页面的 view.py 文件中——我知道模型推荐用于信号,但所使用的模型实际上来自 allauth 包:

    from allauth.account.signals import user_signed_up, email_confirmed
    from django.dispatch import receiver
    from django.contrib.auth.models import Group
    from django.contrib.auth.models import User
    from allauth.account.models import EmailAddress
    
    @receiver(user_signed_up)
    def user_signed_up_(request, user, **kwargs):
    
        user.is_active = False
        user.is_staff = True
        Group.objects.get(name='SurveyManager').user_set.add(user)
    
        user.save()
    
    @receiver(email_confirmed)
    def email_confirmed_(request, email_address, **kwargs):
    
        new_email_address = EmailAddress.objects.get(email=email_address)
        user = User.objects.get(new_email_address.user)
        user.is_active = True
    
        user.save()
    

    唯一还没有完全工作的是 email_confirmed 信号处理——它声称“EmailAddress 匹配查询不存在”,当它在数据库条目中明显匹配时,但我会继续发布在a separate question

    【讨论】:

    • 嘿,这就是我正在尝试使用类似代码将用户设置为活动的。但是,就我而言,用户状态未设置为活动状态。基本没有变化。这是常见的还是我做错了什么?如果您特别需要代码,请告诉我。
    • @DivijSehgal 我建议您在另一个问题中发布您的代码并在此处链接。我去看看能不能回答。
    • 这是个蹩脚的问题,我错误地设置了 pre_save 信号以确保我始终将用户保存为非活动用户。现在将其转移到业务逻辑。不过谢谢:)
    【解决方案3】:

    ACCOUNT_EMAIL_VERIFICATION(=“可选”) 确定注册期间的电子邮件验证方法 - 选择“强制”、“可选”或“无”之一。当设置为“强制”时,用户将被阻止登录,直到验证电子邮件地址。选择“可选”或“无”以允许使用未经验证的电子邮件地址登录。如果是“可选”,则仍然发送电子邮件验证邮件,而如果为“无”,则不发送电子邮件验证邮件。

    【讨论】:

    • 我已将其设置为强制,并且该部分工作正常。不幸的是,这似乎与数据库中用户条目中的“活动”属性无关。如果我使用 allauth 登录,您所说的将适用,但我实际上绕过了我的网站并使用管理面板登录,这似乎并不关心地址是否经过验证。管理面板确实关心'active'属性是否设置为false,这就是为什么我想在验证地址时将其设置为true(并在用户使用时将其默认为false最初创建)。
    猜你喜欢
    • 2018-02-18
    • 2015-02-05
    • 2020-11-17
    • 2021-11-27
    • 2020-09-30
    • 2015-10-22
    • 2014-04-23
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多