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.

Другие вопросы по тегам