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

6
我主要使用django-allauth来创建管理员后台的用户账户。我希望实现以下功能:
1. 当用户通过注册流程时,发送验证电子邮件(目前已经实现),并将用户设置为未激活、员工,并默认分配“SurveyManager”组给他们。目前,用户被创建时,其active属性为true,staff属性为false,没有分配任何组。
2. 在点击验证地址中的链接后,我希望用户被设置为激活状态,这样他们就可以通过管理员后台登录。
我的具体问题是:我不知道如何或在哪里设置用户的active、staff和group属性的默认值——我想这应该在models.py文件中完成,但据我所知,用户模型包含在auth应用程序中;以及如何触发代码在电子邮件验证完成后将用户的active标志更改为true。
谢谢您提前的帮助,如果这篇文章写得不好,请见谅,这是我的第一篇文章!

在尝试产生这些结果时,您并没有真正描述您遇到了什么具体的编程问题。 - takendarkk
抱歉 - 我的具体问题是我不知道:1)如何或在哪里设置用户的活动、员工和组的默认值 - 我想这应该在models.py文件中完成,但据我所知,用户模型包含在auth应用程序中。2)如何触发代码以将用户活动标志更改为true,一旦电子邮件验证完成。 - Gravity Grave
4个回答

14

使用信号似乎(大部分)解决了我的问题。 这篇文章 给了我灵感(但不幸的是没有提供任何代码示例),而这个网站给了我一些实际的具体修改示例(这在 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()

目前唯一还不太正常的是处理电子邮件确认信号--它声称"EmailAddress matching query does not exist",但在数据库条目中显然是匹配的,我将在另一个问题中发布此内容。


嘿,我正在尝试使用类似的代码将用户设置为活动状态。然而,在我的情况下,用户状态没有被设置为活动状态。基本上它没有改变。这是常见的问题还是我做错了什么?如果需要,让我知道你是否需要具体的代码。 - Divij Sehgal
@DivijSehgal 我建议你在另一个问题中发布你的代码,并在这里链接它。我会在那里看看能否回答你的问题。 - Gravity Grave
这是一个愚蠢的问题,我错误地设置了一个pre_save信号来确保我总是将用户保存为非活动状态。现在已经转移到业务逻辑中了。不过还是谢谢 :) - Divij Sehgal

1

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


1
我已将其设置为强制性,这部分工作正常。不幸的是,这似乎与数据库中用户条目中的“活动”属性无关。如果我使用allauth登录,您所说的内容就会适用,但实际上我正在绕过它来使用管理面板进行登录,而管理面板似乎并不关心地址是否经过验证。然而,当“地址”得到验证时,“管理面板”确实会关心“活动”属性是否被设置为false。这就是为什么我希望在地址得到验证时将其设置为true(并在最初创建用户时将其默认设置为false)的原因。 - Gravity Grave

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()

-1
一般来说,对于电子邮件验证,Django有自己的表格。你可以检查例如mysql> Select * From account_emailconfirmation;
顺便说一下,如果邮件没有发送到你的邮箱:我曾经苦苦挣扎,后来发现缺少了这个配置: DEFAULT_FROM_EMAIL = 'test.noreply@gmail.com'。 否则,默认是webmaster@...,但在我的mod_wsgi环境中无法工作。

这并没有回答如何在验证了用户的电子邮件地址后将其设置为活动状态的问题。 - He3lixxx

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