Когда я редактирую профиль, как сделать так, чтобы система автоматически отправляла подтверждение по электронной почте, если email изменен - Django

Итак... Мой основной замысел состоит в том, что когда пользователь редактирует свой аккаунт и меняет email, система должна изменить всю остальную информацию, кроме email, и отправить письмо на новый email (введенный пользователем) со ссылкой подтверждения. После нажатия на ссылку система должна перенаправить пользователя на другую страницу и изменить email для этой учетной записи. Пожалуйста, подскажите, как я могу это сделать.

Мое мнение:

class NormalUserEditView(generic.UpdateView):
    form_class = EditProfileFormNormal
    template_name = 'authentication/edit_normalprofile.html'
    success_url = reverse_lazy('profile')

    def form_valid(self, form):
        messages.success(self.request, f'Account Edit: Successful')
        return super().form_valid(form)

    def get_object(self):
        return self.request.user

По поводу электронной почты я имел в виду следующее представление:

def register_user(request):
    if request.method == "POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            myuser = User.objects.create_user(
                username=form.cleaned_data['username'],
                first_name=form.cleaned_data['first_name'],
                last_name=form.cleaned_data['last_name'],
                email=form.cleaned_data['email'],
                password=form.cleaned_data['password1'],
                )
            myuser.is_active = False
            myuser.save()

            # "Thank You For Registering" Email
            subject = "Welcome To some website"
            body = "Hello " + myuser.first_name + "!\n" + "Thank you for registering to some website. Your account has been registered. However, it has not been activated. We have sent you another email that contains a link. In order to activate your account you must click on that link. The email will be sent shortly. \nNOTE: If you have not created an account in some website, please ignore this email. \n \nsome website."
            from_email = settings.EMAIL_HOST_USER
            to_list = [myuser.email]

            send_mail(subject, body, from_email, to_list, fail_silently=True)

            # Confirm Email

            current_site = get_current_site(request)
            email_subject = "Confirm Your Email - some website"
            email_message = render_to_string('authentication/email_confirmation.html', {
                    'name': myuser.first_name,
                    'domain': current_site.domain,
                    'uid': urlsafe_base64_encode(force_bytes(myuser.pk)),
                    'token': generate_token.make_token(myuser),
                })
            email = EmailMessage(
                email_subject,
                email_message,
                settings.EMAIL_HOST_USER,
                [myuser.email],
                )
            email.fail_silently=True
            email.send()

            messages.success(request, ("Registration: Successful!"))

            return redirect('confirm-address-page')
    else:
        form = RegisterUserForm()

    return render(request, 'authentication/register.html', {
        'form':form,
        })

это для генерации токенов:

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from six import text_type

class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self,user,timestamp):
        return (
        text_type(user.pk) + text_type(timestamp) 
        # text_type(user.profile.signup_confirmation)
        )

generate_token = TokenGenerator()

это для форм:

class RegisterUserForm(UserCreationForm):
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
    first_name = forms.CharField(max_length=50, widget=forms.TextInput(attrs={'class': 'form-control'}))
    last_name = forms.CharField(max_length=50, widget=forms.TextInput(attrs={'class': 'form-control'}))

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def __init__(self, *args, **kwargs):
        super(RegisterUserForm, self).__init__(*args, **kwargs)

        self.fields['username'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['class'] = 'form-control'

email_confirmation.html :

{% autoescape off %}

Welcome to Some Website

Hello {{ name }}!

Please Confirm your email by clicking on the following link:

Confirmation Link:

http://{{ domain }}{% url 'activate' uidb64=uid token=token %}

{% endautoescape %}
Вернуться на верх