django-allauth:如何将用户设置为仅在电子邮件验证后才激活

问题描述 投票:0回答:4

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

1)当用户完成注册程序时,发送验证电子邮件(到目前为止我已经完成此操作)并将用户设置为非活动,员工,并默认分配给他们“SurveyManager”组。目前,创建的用户的 active 设置为 true,staff 设置为 false,并且未分配任何组。

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

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

提前致谢——抱歉,如果这是一篇创作不佳的帖子,这是我的第一篇!

django django-admin django-authentication django-allauth
4个回答
13
投票

我似乎(大部分)通过使用信号解决了我的问题。 这篇文章给了我这个想法(但不幸的是没有提供任何代码示例),而这个网站给了我一些实际的具体示例来修改(我发现这是 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 信号处理——它声称“电子邮件地址匹配查询不存在”,当它在数据库条目中明显匹配时,但我会继续并将其发布在 一个单独的问题


1
投票

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


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

0
投票

一般来说,对于电子邮件验证,Django 有自己的表。您可以检查例如mysql> 从 account_emailconfirmation 选择 *;

顺便说一句,如果电子邮件没有发送到您的邮箱:我费了很大劲才发现缺少此配置: DEFAULT_FROM_EMAIL = '[email protected]'。 否则,它的 webmaster@...对我来说 mod_wsgi 不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.