django-allauth изменить адрес электронной почты пользователя с / без проверки

Я использую простой django-allauth без каких-либо учетных записей в социальных сетях. У каждого пользователя должен быть ровно один адрес электронной почты, связанный с его учетной записью, то есть тот, который использовался для регистрации / проверки. Я хочу разрешить моим пользователям изменять этот адрес электронной почты.

Итак, мой первый вопрос: должен ли я снова проверять новый адрес электронной почты, отправляя электронное письмо с подтверждением? Мое чутье подсказывает: мне лучше проверить этот новый адрес электронной почты. Но у меня нет реальных аргументов в пользу этого.

Мой второй вопрос: если хотите, чтобы это было проверено, поддерживается ли этот процесс каким-либо образом уже с помощью django-allauth? Я видел EmailView и AddEmailForm. Но они основаны на предположении, что одна учетная запись может иметь более одного адреса электронной почты (а это не то, что я хочу).

Спасибо


person schacki    schedule 03.11.2013    source источник
comment
Взгляните на EmailView и AddEmailForm.   -  person elssar    schedule 03.11.2013
comment
Спасибо, elssar, только что обновил свой вопрос.   -  person schacki    schedule 04.11.2013


Ответы (2)


Есть несколько способов сделать это.

Либо слушайте обработчик сигналов email_confirmed , и иметь функцию, которая проверяет, есть ли у пользователя два EmailAccount объекта, связанных с его учетной записью, и если да, то удаляет другой EmailAccount объект.

Другой будет установлен EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL и EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL в ваших настройках, и связанный вид удалит лишний адрес электронной почты, если он существует.

Другой способ - просто переопределить EmailView и / или AddEmailForm и заставить их делать то, что вы хотите.

Для изменения адреса электронной почты без подтверждения вы можете просто вызвать в своем представлении _ 8_.

person elssar    schedule 04.11.2013
comment
Когда мы используем EmailAddress.change, должен срабатывать email_changed сигнал? Поправьте меня если я ошибаюсь. - person Prakhar; 06.07.2021
comment
@Prakhar Я давно не использовал allauth, поэтому могу ошибаться, но при быстром сканировании кода кажется, что сигнал email_changed срабатывает, когда пользователь меняет свой основной адрес электронной почты с одного объекта электронной почты на другой. EmailAddress.change изменяет значение электронного письма в том же объекте. - person elssar; 07.07.2021

Думаю, новый адрес электронной почты нужно подтвердить. Если ваше приложение отправляет периодические электронные письма, вы не хотите отправлять множество писем только на любой адрес электронной почты, который вводит пользователь.

Что я сделал, так это разрешил несколько адресов электронной почты, пока второй адрес электронной почты не будет проверен. Затем прислушайтесь к сигналу email_confirmed django-allauth, как предложил elssar. Как только адрес будет подтвержден, установите новый адрес электронной почты в качестве основного, а затем удалите все предыдущие EmailAddess. Вот упрощенный пример того, чем я закончил:

модели:

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

class CustomUser(models.Model):
    ...
    def add_email_address(self, request, new_email):
        # Add a new email address for the user, and send email confirmation.
        # Old email will remain the primary until the new one is confirmed.
        return EmailAddress.objects.add_email(request, self.user, new_email, confirm=True)

@receiver(email_confirmed)
def update_user_email(sender, request, email_address, **kwargs):
    # Once the email address is confirmed, make new email_address primary.
    # This also sets user.email to the new email address.
    # email_address is an instance of allauth.account.models.EmailAddress
    email_address.set_as_primary()
    # Get rid of old email addresses
    stale_addresses = EmailAddress.objects.filter(
        user=email_address.user).exclude(primary=True).delete()

взгляды:

def update_user_details(request):
    user = request.user
    new_email = request.POST.get('new_email')
    user.custom_user.add_email_address(request, new_email)
    ...
person evan_schmevan    schedule 15.04.2015
comment
Возможно, мне что-то не хватает, но мне кажется, что все, что вам нужно сделать, чтобы реализовать единый адрес электронной почты, - это импорт и код из @receiver… в models. т.е. вам не нужна CustomUser модель или код в views - person typonaut; 30.06.2020
comment
@typonaut У вас может быть один адрес электронной почты с меньшими затратами, но это решение также позволяет обновить адрес электронной почты, при этом не позволяя пользователю хранить несколько электронных писем. - person ZG101; 24.09.2020