Имя пользователя и пароль всегда неверны в моей форме аутентификации django AuthenticationForm
Я пытаюсь залогинить пользователя по его имени пользователя и паролю, но когда я пытаюсь проверить form.is_valid(), он возвращает False. Список ошибок содержит ошибку: "Пожалуйста, введите правильное имя пользователя и пароль. Обратите внимание, что оба поля могут быть чувствительны к регистру". Когда я не указываю свой собственный пост, он тоже не работает.
Я искал опечатку, но не нашел. В интернете мне вообще ничего не помогло. Я пробовал менять форму и ее поля, но ошибка была та же самая.
views.py
from django.views.generic import *
from django.views.generic import *
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, login, logout
...
class RegisterView(CreateView):
form_class = UserRegisterForm
success_url = reverse_lazy('main:homepage')
template_name = "accounts/register.html"
def post(self, request):
form = self.get_form()
if form.is_valid():
user = form.save()
login(request, user)
return redirect("main:homepage")
else:
print(form.errors)
return redirect("accounts:register")
class LoginView(FormView):
form_class = AuthenticationForm
template_name = "accounts/login.html"
def post(self, request):
form = self.get_form()
if form.is_valid():
form.clean()
user = authenticate(
request,
username=form.cleaned_data["username"],
password=form.cleaned_data["password"],
)
login(request, user)
return redirect("main:homepage")
else:
print(form.errors)
print(form.cleaned_data)
return redirect("accounts:login")
forms.py
from django import forms
from django.contrib.auth import get_user_model, authenticate, login
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = get_user_model()
fields = ['username', 'email', 'first_name']
def save(self):
self.clean()
user = self.Meta.model(
username = self.cleaned_data['username'],
email = self.cleaned_data['email'],
password = self.cleaned_data['password2'],
)
user.save()
return user
login.html
<div class="wrap">
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">CONFIRM LOGIN</button>
</form>
</div>
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = get_user_model()
fields = ['username', 'email', 'first_name']
def save(self):
self.clean()
user = self.Meta.model(
username = self.cleaned_data['username'],
email = self.cleaned_data['email'],
)
# Set password with method is solution
user.set_password(self.cleaned_data['password2'])
user.save()
return user
Ваши фрагменты кода все правильные, но способ сохранения пароля пользователя в методе from via save неправильный, способ сохранения пароля, он сохраняет сырой текстовый вид пароля в базу данных, если вы хотите проверить, просто откройте вашу базу данных и проверьте поля пароля, они хранятся в сыром текстовом формате (exapmle : testing123), а django сохраняет, извлекает, пароль используя алогритм хэширования пароля sha256, пока и если вы не указали его и его хэши в pbkdf2_sha256. ... этот формат .
не сохраняйте пользователя таким образом :
user = User(username = username , password = password , email = email)
user.save()
сохранить так
user = User(username = username , email = email)
user.set_password(password)
user.save()
Обновите свой фрагмент кода :
from django import forms
from django.contrib.auth import get_user_model, authenticate, login
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = get_user_model()
fields = ['username', 'email', 'first_name']
def save(self):
self.clean()
user = self.Meta.model(
username = self.cleaned_data['username'],
email = self.cleaned_data['email'],
)
user.set_password(self.cleaned_data['password2'])
user.save()
return user
Это выполнит необходимую работу.
The reason this does not work is because passwords are hashed, and your UserRegisterForm
does not hash the password properly. There is however no need to override the .save(…)
method. Django's UserCreationForm
[Django-doc] already takes care of this properly, since it is a ModelForm
[Django-doc], so:
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = get_user_model()
fields = ['username', 'email', 'first_name']
# no override of save