django-allauth:如何在电子邮件验证后将用户设置为活动状态

时间:2014-07-16 21:29:51

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

我使用django-allauth主要是为管理后端创建用户帐户。我希望发生的是:

1)当用户完成注册程序时,发出验证电子邮件(我目前已执行此操作)并将用户设置为非活动状态,人员和分配给他们的“SurveyManager”组defult。目前,创建的用户的活动设置为true,人员设置为false,并且未分配任何组。

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

我的具体问题是我不知道:1)如何或在何处设置用户的活动,人员和组的默认值 - 我想这可以在models.py文件中完成,但它是我的理解是用户模型包含在auth app中; 2)如何在电子邮件验证完成后触发代码将用户活动标志更改为true。

提前致谢 - 对不起,如果这是一篇创作不佳的帖子,那就是我的第一个!

3 个答案:

答案 0 :(得分:9)

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

我最终将以下代码放在我的页面的view.py文件中 - 我知道models.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中发布。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我知道这是一篇旧帖子,但我在自己的搜索中遇到了这个帖子。在回复您的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()