Исходный код core.forms
"""
Формы аутентификации и регистрации пользователей (forms.py).
Содержат кастомную валидацию безопасности, включая проверку паролей
и алгоритм оценки схожести юзернеймов для защиты от фишинга.
"""
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import AuthenticationForm
from difflib import SequenceMatcher
[документация]
class RegisterForm(forms.Form):
"""Форма регистрации нового аккаунта с продвинутыми проверками безопасности."""
username = forms.CharField(max_length=150)
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
password2 = forms.CharField(widget=forms.PasswordInput)
[документация]
def clean_username(self):
"""
Кастомная валидация юзернейма. Запрещает регистрацию имён,
которые похожи на уже существующие более чем на 80% (дистанция Левенштейна / SequenceMatcher).
"""
username = self.cleaned_data["username"]
for user in User.objects.all():
if SequenceMatcher(None, user.username.lower(), username.lower()).ratio() > 0.8:
raise forms.ValidationError("Такое имя пользователя уже занято или слишком похоже на существующее.")
return username
[документация]
def clean(self):
"""Общая проверка формы. Убеждается, что основной и повторный пароли совпадают."""
cleaned_data = super().clean()
if cleaned_data.get("password") != cleaned_data.get("password2"):
raise forms.ValidationError("Пароли не совпадают.")
return cleaned_data
[документация]
class LoginForm(AuthenticationForm):
"""Форма авторизации пользователей с применением стилей Bootstrap классов."""
username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control'}))