django-allauth:如何正确使用email_confirmed信号将用户设置为活动状态

重力坟墓

另一篇文章中,我提到我试图使用allauth的email_confirmed信号将已确认用户的is_active字段更改为true。但是,以下代码给了我一个例外:“用户匹配查询不存在”。

from allauth.account.signals import email_confirmed
from django.dispatch import receiver
from django.contrib.auth.models import User

@receiver(email_confirmed)
def email_confirmed_(request, email_address, **kwargs):

    user = User.objects.get(email=email_address)
    user.is_active = True

    user.save()

我尝试对此进行重新处理,但仍然遇到类似的异常,“不存在匹配查询的电子邮件地址”。

from allauth.account.signals import email_confirmed
from django.dispatch import receiver
from django.contrib.auth.models import User
from allauth.account.models import EmailAddress

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

追溯在这里:

Environment:


Request Method: POST
Request URL: http://www.website.com/accounts/confirm-email/5901011619071fce757447ba146fe6312cb27bc0fee34d29665b857b479b49fc/

Django Version: 1.6.1
Python Version: 3.3.2
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'surveys',
'registration',
'django.contrib.sites',
'bootstrap3',
'allauth',
'allauth.account',
'allauth.socialaccount')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python3.3/dist-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.3/dist-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.3/dist-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/usr/local/lib/python3.3/dist-packages/allauth/account/views.py" in post
  204.         confirmation.confirm(self.request)
File "/usr/local/lib/python3.3/dist-packages/allauth/account/models.py" in confirm
  111.                                          email_address=email_address)
File "/usr/local/lib/python3.3/dist-packages/django/dispatch/dispatcher.py" in send
  185.             response = receiver(signal=self, sender=sender, **named)
File "/home/username/website/webapp/mysite/views.py" in email_confirmed_
  84.     new_email_address = EmailAddress.objects.get(email=email_address)
File "/usr/local/lib/python3.3/dist-packages/django/db/models/manager.py" in get
  151.         return self.get_queryset().get(*args, **kwargs)
File "/usr/local/lib/python3.3/dist-packages/django/db/models/query.py" in get
  307.                 self.model._meta.object_name)

Exception Type: DoesNotExist at /accounts/confirm-email/5901011619071fce757447ba146fe6312cb27bc0fee34d29665b857b479b49fc/
Exception Value: EmailAddress matching query does not exist.

这让我感到困惑,因为我可以同时检查用户表和数据库中“电子邮件地址”表中的电子邮件地址字段,而且它们似乎都具有匹配的电子邮件地址。帮助将不胜感激!

重力坟墓

原来由email_confirmed信号返回的email_address实际上不是包含地址的字符串,而是一个对象-allauth.account.models.EmailAddress。从文档中根本不是很清楚,但是很高兴现在已解决。最终工作的代码是:

@receiver(email_confirmed)
def email_confirmed_(request, email_address, **kwargs):

    user = User.objects.get(email=email_address.email)
    user.is_active = True

    user.save()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

选中 email_confirmed 时,DJANGO 更新 is_active

Django-将用户设置为不活动5秒钟

如何在Django ModelForm中设置基于用户的表单字段选择(使用django-allauth)

使用django-allauth登录后如何为用户设置登录页面

如何使用django-allauth查找用户的patreon认捐层

当用户使用 google 或 facebook django allauth 注册时,如何在用户表中设置密码

Django-allauth如何禁止某些用户?

几天不活动后,Django Allauth似乎注销了用户

Django Rest Framerowk将用户/所有者设置为ModelSerializer(Tweet)

用Django信号通知用户_ Django

Django:如何在编辑或更新后将用户返回到正确的分页页面?

如何断开Django信号?

在django 1.8中,如何在设置自定义用户模型时为post_migrate和post_syncdb信号接收者设置发送者?

Django 用户,将用户的 is_active 设置为 false 一分钟,然后再次重新激活

使用选定的特定组创建用户时,如何在 Django 中将 is_staff 设置为 True

创建用户后,如何将用户与Django模型关联?

django信号-正确处理

未为新的Django用户设置密码

如何在 DJANGO 的自定义 ADMIN 页面中将用户“id”和用户“profile”更新为超级用户

在 html 中点击按钮并使用 DetailView (Django) 时使用户处于活动状态

使用django-allauth时如何自定义用户配置文件

如何使用Django allauth适配器清理用户名?

如何在django allauth中允许用户删除帐户?

如何在Django中将allauth用户引用为外键

使用django-allauth注册多个用户类型

使用django allauth从Facebook登录时,请求用户是admin

如何在Django中正确使用多用户模型?

如何使django用户处于非活动状态并使所有会话无效