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
Вернуться на верх