Django - Как выдать ошибку, если пользователь зарегистрировался, но не подтвердил свой email?
Я пытаюсь вызвать функцию из представления в моих формах. Я пытался сделать это несколькими способами, но понял, что делаю это не совсем правильно.
Конечный результат Конечный результат Я хотел бы добиться: выдавать ошибку на странице входа, если пользователь зарегистрировался, но не подтвердил свой email.
Как я могу заставить его работать?
forms.py
from django import forms
from django.core.exceptions import ValidationError
from . import views
from . import models
class LoginForm(forms.Form):
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
remember_me = forms.BooleanField(required=False)
def clean(self):
email = self.cleaned_data.get("email")
password = self.cleaned_data.get("password")
try:
user = models.User.objects.get(username=email)
user_verified = views.complete_verification()
if user.check_password(password):
return self.cleaned_data
else:
self.add_error(
"password", forms.ValidationError("Incorrect password. Try again.")
)
if not user_verified:
self.add_error(
"email",
forms.ValidationError(
"Please check your inbox and verify your email."
),
)
except models.User.DoesNotExist:
self.add_error("email", forms.ValidationError("The user does not exist."))
views.py
def complete_verification(request, key):
try:
user = models.User.objects.get(email_secret_key=key)
user.email_verified = True
user.email_secret_key = ""
user.is_active = True
if user.email_verified and user.is_active:
user.save()
login(request, user, backend="django.contrib.auth.backends.ModelBackend")
# todo: add success message
except models.User.DoesNotExist:
# todo: add error message
pass
return redirect(reverse("pages:home"))
models.py
import uuid
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.core.mail import send_mail
from django.utils.html import strip_tags
from django.template.loader import render_to_string
class User(AbstractUser):
"""Custom User Model"""
email_verified = models.BooleanField(default=False)
email_secret_key = models.CharField(max_length=18, default="", blank=True)
def verify_email(self):
if self.email_verified is False:
secret_key = uuid.uuid4().hex[:18]
self.email_secret_key = secret_key
html_message = render_to_string(
"emails/email_verify.html", {"secret_key": secret_key}
)
send_mail(
"Verify Webapp Account",
strip_tags(html_message),
settings.EMAIL_FROM,
[self.email],
fail_silently=False,
html_message=html_message,
)
self.save()
return