Почему 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()
не требует двух аргументов