Django: невозможно выполнить валидаторы, вместо этого выполняется блок Except

Я пытаюсь сделать проверку электронной почты и пароля с помощью валидаторов в Django. У меня есть собственная форма регистрации. Я просто извлекаю из него значения электронной почты и пароля, используя представление под названием «Регистрация». Всякий раз, когда я пытаюсь зарегистрировать нового пользователя, код всегда переходит в блок исключений, я почти уверен, что делаю что-то не так с validate_email() и validate_password(). Вот мой взгляд:

def register(request):
  if request.method == 'GET':
      return render(request, 'index.html')
  else:
      username = request.POST['username']
      email = request.POST['email']
      pass1 = request.POST['password1']
      pass2 = request.POST['password2']
      try:
        validate_email(email)
      except ValidationError:
        return render(request, 'register.html', {'emailErr':'Hmm.. Did you enter a valid email?'})
      try:
        validate_password(pass1)
        validate_password(pass2)
      except ValidationError: #This block runs
        return render(request, 'register.html', {'passErr':'Please enter a valid password'})
      if User.objects.filter(email=email).exists():
          return render(request, 'register.html', {'error1':'Email already exists'})
      else:
          if pass1 == pass2:
            try:
                user = User.objects.create_user(username=username, password=pass1, email=email)
                user.save()
                login(request,user)
                sendConfirm(user)
                return render(request, 'confirm_please.html')
            except IntegrityError:
                return render(request, 'register.html', {'error2':'User already exists'})
          else:
            return render(request, 'register.html', {'error3':'Make sure the passwords are same'})

Небольшая помощь будет оценена


person Fanceh    schedule 01.02.2021    source источник


Ответы (2)


На первый взгляд, ваш пароль просто не проходит проверку. Просто передайте правильную ошибку пользователю вместо:

'Пожалуйста, введите правильный пароль'

Попробуйте это вместо этого:

from django.core.exceptions import ValidationError
from django.contrib.auth.password_validation import validate_password

def register(request):
    ...
    try:
        validate_password(pass1)
        validate_password(pass2)
    except ValidationError as err:
        return render(request, 'register.html', {'passErr':'; '.join(err.messages)})
    ...
person NKSM    schedule 01.02.2021
comment
Для чего .join(err.messages)? - person Fanceh; 01.02.2021
comment
Нвм исправил :) - person Fanceh; 01.02.2021
comment
@Fanceh, err.messages возвращает list. Таким образом, вы можете использовать join, чтобы преобразовать его в string. - person NKSM; 01.02.2021
comment
Ясно, спасибо за чтение моего кода и за дополнительные знания! :D - person Fanceh; 01.02.2021

Код работает правильно, это validate_password, который делает исключение, потому что он запрашивает 8-значный пароль. Спасибо за прочтение! :)

person Fanceh    schedule 01.02.2021