Как реализовать подтверждение почты по коду Django?

Для реализации подтверждения почты по коду в Django можно использовать следующий подход:

1. Создание модели для сохранения информации о пользователе и коде подтверждения:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        return self.create_user(email, password, **extra_fields)

class MyUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'

    def get_full_name(self):
        # Метод, возвращающий полное имя пользователя
        pass

    def get_short_name(self):
        # Метод, возвращающий сокращенное имя пользователя
        pass

2. Создание сервиса, который будет генерировать и отправлять код подтверждения по электронной почте:

from django.core.mail import send_mail
from django.conf import settings
import random

class EmailConfirmationService:
    @staticmethod
    def send_confirmation_code(user):
        code = random.randint(100000, 999999)
        user.email_confirmation_code = code
        user.save()

        message = f"Your confirmation code is: {code}"
        send_mail(
            'Confirmation Email',
            message,
            settings.DEFAULT_FROM_EMAIL,
            [user.email],
            fail_silently=False,
        )

3. Создание представления, которое будет обрабатывать запрос на подтверждение почты:

from django.views import View
from django.shortcuts import redirect, render
from .services import EmailConfirmationService

class EmailConfirmationView(View):
    def get(self, request):
        # Отобразить форму ввода кода
        return render(request, 'confirmation.html')

    def post(self, request):
        code = int(request.POST.get('code', 0))

        if request.user.email_confirmation_code == code:
            request.user.is_active = True
            request.user.save()
            return redirect('home')

        # Некорректный код, повторный запрос
        return redirect('confirm_email')

4. Создание URL-маршрута для представления обработки подтверждения почты:

from django.urls import path
from .views import EmailConfirmationView

urlpatterns = [
    path('confirm-email/', EmailConfirmationView.as_view(), name='confirm_email'),
]

5. Включение URLs приложения в основной файл urls.py:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),
]

Теперь, при регистрации пользователя, вы можете использовать EmailConfirmationService для отправки кода подтверждения по электронной почте. После этого, представление EmailConfirmationView обрабатывает введенный код и активирует учетную запись пользователя.