Почему AuthenticationForm() в Django не работает?

Я пытался создать функцию в Django для входа пользователей в свои аккаунты. Но она работает только для суперпользователей. Когда я пытаюсь войти с других аккаунтов, она продолжает сбрасывать пароль и выдает сообщение об ошибке 'Please enter a correct username and password'. Однако и имя пользователя, и пароль верны.

Данные из request.POST поступают в виде QuerySet (keys-'csrfmiddlewaretoken','username','password'). Когда я помещаю request.POST в AuthenticationForm(), он не проходит через часть 'if form.is_valid():'.

Что я должен сделать, чтобы это сработало? Пожалуйста, кто-нибудь может мне помочь? Заранее спасибо.

Вот код:

  form=AuthenticationForm()
  if request.method=="POST":
      form=AuthenticationForm(request, data=request.POST)
      if form.is_valid():
          username=form.cleaned_data.get('username')
          password=form.cleaned_data.get('password')
          user=authenticate(username=username,password=password)
          if user is not None:
              login(request,user)
              messages.info(request,'You have successfully logged in!')
              return redirect('news')
          else:
              messages.error(request,'Invalid data!') 
      else:
          messages.error(request,'Invalid data!')           
  return render(request,'post/login.html',{'form':form})```

Я думаю, что проблема может быть в регистрации пользователя. Вы можете, пожалуйста, опубликовать функцию регистрации пользователя.

С помощью следующего кода (django 4.0.6) я смог получить пользователя, вошедшего в систему:

def log_in(request):
    form = AuthenticationForm()
    if request.method == "POST":
        form = AuthenticationForm(None, data=request.POST)
        if form.is_valid():
            form.clean()
            user = form.get_user()
            if user is not None:
                login(request, user)
            else:
                print("nay")
        else:
            print("ney")
    return render(request, 'login.html', {'form': form})

Ваш метод входа должен выглядеть следующим образом:

def log_in(request):
    form = AuthenticationForm()
    if request.method == "POST":
        form = AuthenticationForm(None, data=request.POST)
        if form.is_valid():
            form.clean()
            user = form.get_user()
            if user is not None:
                login(request,user)
                messages.info(request,'You have successfully logged in!')
                return redirect('news')
            else:
                messages.error(request,'Invalid data!') 
        else:
            messages.error(request,'Invalid data!')           
    return render(request,'post/login.html',{'form':form})

функция AuthenticationForm уже выполняет authenticate на своем чистом шаге - поэтому вам не нужно этого делать. Просто вызовите clean и после этого функцию get_user

PS: Помните, что ваш пользователь должен быть активен -> user.is_active должен быть True

В некоторых случаях причиной этого может быть сходство имен классов, что сбивает нас с толку. В данном случае произошла ошибка при наследовании. Следует написать класс UserCreateForm и проблема решена. 😎😎😎

def save(self, commit=True):
    user=super(UserCreateForm, self).save(commit=False)
    user.email=self.cleaned_data.get('email')
    if commit:
        user.save()
    return user    

Попробуйте удалить request из AuthenticationForm(request, data=request.POST). Функция AuthenticationForm() не требует двух аргументов

Вернуться на верх