Как настроить подтверждение регистрации через отправку кода на email в Django?

Для настройки подтверждения регистрации через отправку кода на email в Django, вам потребуется следующие шаги:

1. Установите Django и другие необходимые пакеты, такие как django-registration и django-crispy-forms. Выполните команду pip install django django-registration django-crispy-forms для установки этих пакетов.

2. Создайте новое Django-приложение с помощью команды python manage.py startapp accounts. Затем добавьте это приложение в список INSTALLED_APPS в файле настроек settings.py.

3. Создайте модель пользователя с дополнительными полями для хранения кодов подтверждения. Пример модели может выглядеть следующим образом:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    confirmation_code = models.CharField(max_length=20, blank=True, null=True)
    is_confirmed = models.BooleanField(default=False)

4. Создайте форму регистрации с помощью django-crispy-forms, чтобы пользователь мог ввести свои данные и получить код подтверждения на свой email. Пример формы может выглядеть следующим образом:

from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit

class RegistrationForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ('username', 'email', 'password')

    def __init__(self, *args, **kwargs):
        super(RegistrationForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_id = 'registration-form'
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-2'
        self.helper.field_class = 'col-md-10'
        self.helper.add_input(Submit('submit', 'Register'))

5. Создайте представление для обработки регистрации пользователя, где будет генерироваться код подтверждения, отправляться на email и сохраняться в соответствующих полях модели пользователя. Пример представления может выглядеть следующим образом:

from django.shortcuts import render, redirect
from django.contrib.sites.shortcuts import get_current_site
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes, force_text
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth import get_user_model
from django.core.mail import send_mail

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.set_password(form.cleaned_data['password'])
            user.is_active = False
            user.confirmation_code = default_token_generator.make_token(user)

            user.save()

            current_site = get_current_site(request)
            mail_subject = 'Activate your account'
            message = render_to_string('accounts/activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode('utf-8'),
                'token': user.confirmation_code,
            })
            send_mail(mail_subject, message, '[email protected]', [user.email])

            return redirect('accounts:activation_sent')
    else:
        form = RegistrationForm()

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

6. Создайте представление для активации учетной записи, где пользователь будет вводить полученный на email код подтверждения. Если код верен, то учетная запись пользователя будет активирована. Пример представления может выглядеть следующим образом:

from django.shortcuts import render, redirect
from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_text
from django.contrib.auth.tokens import default_token_generator

User = get_user_model()

def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and default_token_generator.check_token(user, token):
        user.is_confirmed = True
        user.save()
        return redirect('accounts:activated')
    else:
        return redirect('accounts:invalid_activation_link')

7. Создайте шаблоны HTML для страниц регистрации, активации, неверной ссылки активации и отправки кода подтверждения на email. Примеры шаблонов могут выглядеть следующим образом:

register.html:

{% extends 'base.html' %}

{% block content %}
  <h2>Registration</h2>
  <form method="post" action="{% url 'accounts:register' %}">
    {% csrf_token %}
    {{ form|crispy }}
  </form>
{% endblock %}

activation_email.html:

{% autoescape off %}
Hello {{ user.username }},

To activate your account, please click the following link:
http://{{ domain }}{% url 'accounts:activate' uidb64=uid token=token %}

Thank you.
{% endautoescape %}

9. Создайте URL-маршруты в файле urls.py, чтобы маршрутизировать запросы к соответствующим представлениям.

from django.urls import path
from accounts.views import register, activate

app_name = 'accounts'

urlpatterns = [
    path('register/', register, name='register'),
    path('activate/<str:uidb64>/<str:token>/', activate, name='activate'),
]

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