django-allauth: как активировать пользователя только после проверки электронной почты
Я использую django-allauth прежде всего как способ создания учетных записей пользователей для административного бэкенда. Я бы хотел, чтобы это произошло:
1) Когда пользователь проходит процедуру регистрации, отправьте электронное письмо с подтверждением (у меня это работает до сих пор) и задайте пользователя как неактивного, персонал, и с группой "SurveyManager", назначенной ему по умолчанию. В настоящее время пользователь создается с активным значением "истина", персоналом с параметром "ложь" и группами не назначается.
2) После нажатия на ссылку в их электронном письме, чтобы подтвердить свой адрес, я бы хотел, чтобы пользователь был активирован, чтобы он мог войти в систему через административный сервер.
Моя конкретная проблема заключается в том, что я не знаю: 1) как или где установить значения по умолчанию для active, персонала и группы пользователей - я думаю, что это будет сделано в файле models.py, но я понимаю, что пользовательская модель содержится в приложении auth; и 2) как запустить код для изменения активного флага пользователя на true после завершения проверки электронной почты.
Заранее спасибо - извините, если это плохо созданный пост, это мой первый!
4 ответа
Казалось, я (в основном) решил мою проблему с помощью сигналов. Этот пост дал мне идею (но, к сожалению, не предоставил никаких примеров кода), в то время как этот сайт дал мне некоторые конкретные конкретные примеры для модификации (что я нашел редким товаром в мире 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 не существует", когда он явно совпадает в записях базы данных, но я продолжу и опубликую это в отдельном вопрос
ACCOUNT_EMAIL_VERIFICATION (= "необязательно") Определяет метод проверки электронной почты во время регистрации - выберите один из "обязательных", "необязательных" или "нет". Когда установлено "обязательное", пользователь блокируется от входа, пока адрес электронной почты не будет подтвержден. Выберите "опционально" или "нет", чтобы разрешить вход в систему с непроверенным адресом электронной почты. В случае "необязательно", электронное письмо с подтверждением по-прежнему отправляется, тогда как в случае "нет" письма с подтверждением по электронной почте не отправляются.
Я знаю, что это старый пост, но я наткнулся на эту ветку в своих поисках. В ответ на вашу проблему с email_confirmed используйте email=kwargs['email_address']. Email при вызове экземпляра EmailAddress.
@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()
В общем, для проверки электронной почты в Django есть своя таблица. Вы можете проверить, например, mysql> Выберите * From account_emailconfirmation;
Кстати, если электронные письма не отправляются на ваш почтовый ящик: я много боролся и обнаружил, что эта конфигурация отсутствует:DEFAULT_FROM_EMAIL = 'test.noreply@gmail.com'. В противном случае это webmaster@... который у меня не работал с mod_wsgi.