Как проверить, зарегистрирован ли пользователь (как правильно использовать user.is_authenticated)?

Я просматриваю этот сайт, но просто не могу понять, как это сделать, поскольку он не работает. Мне нужно проверить, зарегистрирован ли текущий пользователь сайта (аутентифицирован), и я пытаюсь:

request.user.is_authenticated

несмотря на то, что пользователь вошел в систему, он возвращает только:

>

Я могу выполнять другие запросы (из первого раздела в url выше), например:

request.user.is_active

который возвращает успешный ответ.

Ответ 1

is_authenticated - это функция. Вы должны называть его как

if request.user.is_authenticated():
    # do something if the user is authenticated

Как отметил Питер Роуэлл, что может вас отключить, так это то, что на языке шаблонов Django по умолчанию вы не привязываетесь к скобкам для вызова функций. Таким образом, вы можете увидеть что-то вроде этого в коде шаблона:

{% if user.is_authenticated %}

Однако в коде Python это действительно метод в классе User.

Изменить для Django 1.10: is_authenticated теперь является атрибутом в Django 1.10. Этот метод все еще существует для обратной совместимости, но будет удален в Django 2.0.

Ответ 2

Следующий блок должен работать:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}

Ответ 3

Django 1.10 +

Используйте атрибут, а не метод:

if request.user.is_authenticated: # <-  no parentheses any more!
    # do something if the user is authenticated

Использование метода с тем же именем устарело в Django 2.0 и больше не упоминается в документации Django.


Обратите внимание, что для Django 1.10 и 1.11 значение свойства является CallableBool, а не логическим, что может вызвать некоторые странные ошибки.  Например, у меня было представление, которое вернуло JSON
return HttpResponse(json.dumps({
    "is_authenticated": request.user.is_authenticated()
}), content_type='application/json') 

который после обновления свойства request.user.is_authenticated выбрасывал исключение TypeError: Object of type 'CallableBool' is not JSON serializable. Решением было использование JsonResponse, которое могло бы корректно обрабатывать объект CallableBool при сериализации:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})