5

another post中,我提到我試圖使用allauth的email_confirmed信號將已確認的用戶的is_active字段更改爲true。但是,下面的代碼給我例外「用戶匹配查詢不存在」。django-allauth:如何正確使用email_confirmed信號將用戶設置爲活動

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

我試圖重新工作,並且仍然有類似的異常,「EmailAddress匹配查詢不存在」。

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. 

這是令人困惑我,因爲我可以在兩個用戶表,並在我的數據庫,他們的「電子郵件地址」表都檢查電子郵件地址字段似乎有匹配的電子郵件地址。幫助將不勝感激!

回答

10

發現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() 
+3

或整潔'user = email_address.user' –

+0

謝謝,爲我工作!第一個參數實際上是信號,至少在Django 1.9中是這樣;也許'請求'是一個欺騙性的名字。 – mrooney

相關問題