Проблемы с входом пользователей в систему
Я создал две пользовательские формы на основе UserCreationForm и AuthenticationForm. После регистрации пользователя я хочу сразу же его зарегистрировать, и мне это удалось. Но когда я просто хочу войти в систему, возникает ошибка {'invalid_login': 'Пожалуйста, введите правильные %(имя пользователя) и пароль. Обратите внимание, что оба поля могут быть чувствительны к регистру.', 'inactive': 'This account is inactive.'}, даже если все введенные данные верны.
models.py
class User(AbstractUser):
profile_image = models.ImageField(upload_to='accounts/images', default='default/user.jpg', blank=True, null=True)
address = models.CharField(max_length=130, null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
def __str__(self) -> str:
return f"{self.username}, {self.email}"
forms.py
class LoginForm(AuthenticationForm):
class Meta:
model = User
fields = ['username', 'password']
labels = {
'username': "Username",
'password': 'Password'
}
views.py
class LoginView(View):
def get(self, request):
form = LoginForm()
return render(request, 'accounts/login.html', {'form': form})
def post(self, request):
form = LoginForm(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)
print(f"User {username} login successfully.")
return redirect('blog:index')
print(f"Form errors: {form.error_messages}")
return render(request, 'accounts/login.html', {'form': form})
Шаблон login.html
{% extends 'base.html' %}
{% block title %}
Login user
{% endblock %}
{% block content %}
<div>
<form action="" method="post">
{% csrf_token %}
{{ form }}
<br>
<button type="submit">Log in</button>
</form>
</div>
{% endblock %}
Я думаю, что проблема заключается в атрибуте is_active
вашего пользователя. Поскольку вы не используете супер удобную функцию create_user
, предоставляемую django, ваш код не может установить <youruser>.is_active = True
.
По умолчанию ModelBackend не позволяет этим пользователям войти в систему. Подробнее об этом можно прочитать здесь.
Попробуйте это:
class RegisterView(View):
def post(self, request):
form = RegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password2')
user = create_user(
username=username,
password=password,
yourfield1=yourdata1,
yourfield2=yourdata2,
)
# user.save() not needed anymore
# [...]
Конечно, вы также можете просто добавить в код строку вроде user.is_active = True
, и она будет работать так же хорошо.
class LoginView(View):
def get(self, request):
form = LoginForm()
return render(request, 'accounts/login.html', {'form': form})
def post(self, request):
form = LoginForm(request, request.POST) # added request here
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect('blog:index')
return render(request, 'accounts/login.html', {'form': form})