Для настройки подтверждения регистрации через отправку кода на 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, а затем сможет активировать свою учетную запись, введя этот код.