Когда я редактирую профиль, как сделать так, чтобы система автоматически отправляла подтверждение по электронной почте, если 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 %}