- Создана структура docs/ с категориями: completed, guides, architecture, diagnostic, in-progress, reports - Перемещено 47+ MD файлов из корня проекта в docs/ - Удалено 6 устаревших/дублирующихся файлов - Создана структура backend/scripts/ для тестов и утилит - Перемещено 35 Python скриптов в backend/scripts/ - Создана структура backend/docs/ для технической документации - Перемещено 12 MD файлов backend в backend/docs/ - Перемещены LDAP тестовые данные в backend/tests/fixtures/ - Добавлены README файлы для навигации - Добавлены правила в .github/copilot-instructions.md для размещения документации Результат: - Корень проекта: только README.md - Корень backend/: только manage.py и Django приложения - Вся документация организована в структурированные папки
9.5 KiB
9.5 KiB
Валидация полей ФИО в форме регистрации
Описание
Добавлена валидация для полей "Имя", "Фамилия" и "Отчество", запрещающая ввод цифр.
Изменённые файлы
1. backend/employees/forms_auth.py
Добавлены методы валидации на уровне Django формы:
clean_first_name()- валидация имениclean_last_name()- валидация фамилииclean_patronymic()- валидация отчества
Правила валидации:
- ✅ Разрешены: буквы любых алфавитов, пробелы, дефисы, апострофы
- ❌ Запрещены: цифры (0-9)
- Отчество - опциональное поле (может быть пустым)
Проверки:
# Проверка на наличие цифр
if re.search(r'\d', value):
raise forms.ValidationError("Имя не должно содержать цифры.")
# Разрешённые символы: буквы, пробелы, дефисы, апострофы
if not re.match(r'^[\w\s\-\']+$', value, re.UNICODE):
raise forms.ValidationError(
"Имя может содержать только буквы, пробелы, дефисы и апострофы."
)
2. backend/api/v1/employees/serializers.py
Добавлены методы валидации на уровне DRF API:
validate_first_name()- валидация имени через APIvalidate_last_name()- валидация фамилии через APIvalidate_patronymic()- валидация отчества через API
Использует те же правила, что и Django формы. Защищает API от некорректных данных при прямых запросах.
def validate_first_name(self, value: str) -> str:
"""Валидация имени: только буквы, пробелы и дефисы."""
value = value.strip()
if not value:
raise serializers.ValidationError("Имя обязательно для заполнения.")
if re.search(r'\d', value):
raise serializers.ValidationError("Имя не должно содержать цифры.")
if not re.match(r'^[\w\s\-\']+$', value, re.UNICODE):
raise serializers.ValidationError(
"Имя может содержать только буквы, пробелы, дефисы и апострофы."
)
return value
3. backend/templates/auth/register.html
Добавлены правила клиентской валидации (real-time):
Для имени:
first_name: [
{ type: 'required', message: 'Имя обязательно для заполнения' },
{ type: 'minLength', value: 2, message: 'Минимум 2 символа' },
{
type: 'pattern',
pattern: /^[^\d]+$/,
message: 'Имя не должно содержать цифры'
}
]
Для фамилии:
last_name: [
{ type: 'required', message: 'Фамилия обязательна для заполнения' },
{ type: 'minLength', value: 2, message: 'Минимум 2 символа' },
{
type: 'pattern',
pattern: /^[^\d]+$/,
message: 'Фамилия не должна содержать цифры'
}
]
Для отчества:
patronymic: [
{
type: 'pattern',
pattern: /^[^\d]*$/,
message: 'Отчество не должно содержать цифры'
}
]
Примечание: Для отчества используется /^[^\d]*$/ (звёздочка вместо плюса), потому что поле опциональное и может быть пустым.
Как работает валидация
Уровень 1: Клиентская валидация (JavaScript)
- Работает в режиме реального времени через
liveValidationHandler.js - Показывает ошибку сразу при вводе цифр
- Используется регулярное выражение
/^[^\d]+$/(запрещает любые цифры)
Уровень 2: Серверная валидация (Django Forms)
- Срабатывает при отправке формы через веб-интерфейс
- Методы
clean_first_name(),clean_last_name(),clean_patronymic() - Проверяет отсутствие цифр через
re.search(r'\d', value) - Также проверяет допустимые символы через regex pattern
Уровень 3: API валидация (DRF Serializers)
- Срабатывает при прямых запросах к API
- Методы
validate_first_name(),validate_last_name(),validate_patronymic() - Использует те же правила, что и Django формы
- Защищает от обхода клиентской валидации
Поведение
Разрешённые имена:
- ✅ "Иван"
- ✅ "Мария-Анна" (дефис)
- ✅ "О'Брайан" (апостроф)
- ✅ "Анна Мария" (пробел)
- ✅ "Jean-Claude" (латиница с дефисом)
Запрещённые имена:
- ❌ "Иван123" (содержит цифры)
- ❌ "Мария1" (содержит цифры)
- ❌ "3D-Петр" (начинается с цифры)
Сообщения об ошибках
Клиентская валидация:
- "Имя не должно содержать цифры"
- "Фамилия не должна содержать цифры"
- "Отчество не должно содержать цифры"
Серверная валидация:
- "Имя не должно содержать цифры."
- "Фамилия не должна содержать цифры."
- "Отчество не должно содержать цифры."
- "Имя может содержать только буквы, пробелы, дефисы и апострофы."
- "Фамилия может содержать только буквы, пробелы, дефисы и апострофы."
- "Отчество может содержать только буквы, пробелы, дефисы и апострофы."
Технические детали
Регулярные выражения:
JavaScript (клиент):
/^[^\d]+$/- для обязательных полей (имя, фамилия)/^[^\d]*$/- для опциональных полей (отчество)
Python (сервер):
r'\d'- поиск любых цифрr'^[\w\s\-\']+$'с флагомre.UNICODE- проверка допустимых символов
Импорты:
# backend/employees/forms_auth.py
import re # Добавлен в imports
# backend/api/v1/employees/serializers.py
import re # Добавлен в imports
Тестирование
Проверьте следующие сценарии:
- Попытка ввести цифры в имя → должна появиться ошибка
- Попытка ввести цифры в фамилию → должна появиться ошибка
- Попытка ввести цифры в отчество → должна появиться ошибка
- Ввод имени с дефисом "Анна-Мария" → должно пройти валидацию
- Пустое отчество → должно пройти валидацию (поле опциональное)
- Имя с латиницей "John" → должно пройти валидацию
Связанные файлы
backend/static/js/components/liveValidationHandler.js- модуль live validationbackend/employees/forms_auth.py- Django формы регистрацииbackend/api/v1/employees/serializers.py- DRF сериализаторы для API
Архитектура валидации
┌─────────────────────────────────────────────────────────────┐
│ REGISTRATION FLOW │
└─────────────────────────────────────────────────────────────┘
User Input (Browser)
↓
┌─────────────────────┐
│ Level 1: JavaScript │ → liveValidationHandler.js
│ Real-time check │ → Pattern: /^[^\d]+$/
└─────────────────────┘
↓ (submit)
┌─────────────────────┐
│ Level 2: Django │ → forms_auth.py
│ Form validation │ → clean_first_name(), clean_last_name()
└─────────────────────┘
↓ (to_api_payload)
┌─────────────────────┐
│ Level 3: DRF API │ → serializers.py
│ Serializer check │ → validate_first_name(), validate_last_name()
└─────────────────────┘
↓
Database
Каждый уровень независим и может отклонить некорректные данные.