Django if user.is_authenticated не работает, но пользователь входит в систему
Моя проблема в том, что операция входа выполняется правильно и сессия устанавливается правильно, но user.is_authenticated не работает. Дело в том, что он работает, когда я вхожу через админку, но не так, что я могу сделать, чтобы исправить это?
мой код :
views.py
class LoginView(View):
def get(self, request):
login_form = LoginForm()
context = {
'login_form': login_form
}
return render(request, 'account/login.html', context)
def post(self, request: HttpRequest):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_email = login_form.cleaned_data.get('email')
user_password = login_form.cleaned_data.get('password')
user: User = User.objects.filter(email__iexact=user_email).first()
if user is not None:
check_password = user.check_password(user_password)
if check_password:
login(request, user)
return redirect('home')
else:
login_form.add_error('password', 'password is not correct !')
else:
login_form.add_error('email', 'email dose not exists !')
context = {
'login_form': login_form
}
return render(request, 'account/login.html', context)
header_component.html
<div class="navbar__list">
<ul class="navbar__links">
{% for link in links %}
<li class="navbar__link"><a href="{{ link.url }}">{{ link.name|capfirst }}</a></li>
{% endfor %}
{% if user.is_authenticated %}
<li class="navbar__link"><a href="#">welcome</a></li>
<li class="navbar__link"><a href="{% url 'logout' %}">Log out</a></li>
{% else %}
<li class="navbar__link"><a href="{% url 'login' %}">Login</a></li>
<li class="navbar__link"><a href="{% url 'register' %}">Register</a></li>
{% endif %}
</ul>
</div>
{% if user.is_authenticated %} является устаревшим.
Используйте это вместо:
{% if request.user.is_authenticated %}
# Do something for authenticated users.
...
{% else %}
# Do something for anonymous users.
...
Согласно документации:
Django использует sessions и middleware для подключения системы аутентификации в объекты запросов. Они обеспечивают request.user атрибут каждого запроса, который представляет текущего пользователя. Если текущий пользователь не вошел в систему, этот атрибут будет установлен в экземпляр экземпляр AnonymousUser, иначе это будет экземпляр User. Вы можете различать их с помощью
is_authenticated, как показано выше.
Редактирование: Добавить пояснения к документации.
Я пишу это для друзей, у которых есть эта проблема
Решением этой проблемы является то, что пользователь должен быть is_active равен True для выполнения операции входа, иначе секция
request.user.is_authenticated
Иначе он не работает и не заходит в пользователя
