у меня такая же ситуация, проблема в том что ты создал форму, без формы всё работет но не показывает ошибки.
если откатиться назад, на версию до создания формы, то всё будет воркать с такой вьюхой:
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('some_redirect_url')
return render(request, 'login.html')
я хотел добавить обработку ошибок, для регистрации и для входа.
для регистрации всё получилось за секунду, буд-то 10 раз так делал(первый раз на самом деле)
def special_characters_validator(username):
validator = RegexValidator(
regex=r'^(?!_)[A-Za-z0-9_]+(?<!_)$'
)
try:
validator(username)
except ValidationError:
if username.startswith('_'):
return "Имя пользователя не может начинаться с подчеркивания."
elif username.endswith('_'):
return "Имя пользователя не может заканчиваться подчеркиванием."
else:
return ("Имя пользователя не может содержать пробелы или специальные символы.\n"
r"""^[-!#$%&'*+-/=?^`{}|~"[]()\.]$""")
return None
common_passwords = [
'password', 'qwerty', 'abc123',
'password1', 'iloveyou', '1q2w3e4r',
'qwerty123', 'zaq12wsx', 'dragon',
'sunshine', 'princess', 'letmein',
'monkey', '1qaz2wsx', 'qwertyuiop',
'superman', 'asdfghjkl',
]
class UserRegistrationForm(UserCreationForm):
email = forms.EmailField(label='Email', max_length=254)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
def clean_username(self):
username = self.cleaned_data['username']
# Проверка, что имя пользователя не содержит специальные символы
validator_error = special_characters_validator(username)
if validator_error:
raise ValidationError(f"{validator_error}")
# Проверка, что имя пользователя состоит только из английских букв
if not all(char.isascii() and char.isalnum() or char == '_' for char in username):
raise ValidationError("Имя пользователя может содержать только английские символы и подчёркивание.")
# Проверка на длину юзернейма
if len(username) < 6:
raise ValidationError("Имя пользователя должно содержать не менее 6 символов.")
# Проверка на уникальность имени пользователя
if User.objects.filter(username__iexact=username).exists():
raise ValidationError("Это имя пользователя уже занято.")
elif ForbiddenUsername.objects.filter(username__iexact=username).exists():
raise ValidationError("Это имя пользователя уже занято.")
return username
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email__iexact=email).exists():
raise ValidationError("Этот адрес электронной почты уже используется.")
return email
def clean_password1(self):
password1 = self.cleaned_data.get('password1')
# Проверка, что пароль состоит только из английских символов
if not all(char.isascii() and (char.isalnum() or char in r'''^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''') for char in
password1):
raise ValidationError(
r'''Пароль может содержать только английские буквы,
цифры и специальные символы: ^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''')
# Проверка на длину пароля
if len(password1) < 8:
raise ValidationError("Пароль должен содержать не менее 8 символов.")
# Проверка, что пароль не состоит только из цифр
if password1.isdigit():
raise ValidationError("Пароль не может состоять только из цифр.")
# Проверка, что пароля нет в списке простых
if password1.lower() in common_passwords:
raise ValidationError("Пароль слишком простой.")
return password1
а вот с логином пи**ец, не работает перенапрвление или при переходе на /login бесконечный цикл перенаправления на страницу логина получался.
я тоже ЖЕЛЯЮЩИЙ разобраться в этой проблеме.