Проблемы с user.is_authenticated в шаблоне django
Извините, если вы попробовали помочь мне, когда я спросил об этом раньше. Должен был удалить этот вопрос, потому что по какой-то причине мне не разрешалось редактировать дополнительную информацию.
Я работаю над реализацией аутентификации пользователей на моем сайте django. Все работает. Мои взгляды, модели, URL-адреса и т.д. Настроены. Пользователи могут зарегистрироваться, войти в систему, выйти из системы. Проблема, с которой я столкнулась, заключается в этом фрагменте кода:
{% if request.user.is_authenticated %}
<li><a href="/logout">Log Out</a></li>
{% else %}
<li><a href="/login">Log In</a></li>
{% endif %}
Даже когда я вошел в систему, он по-прежнему отображает "Вход в систему" в качестве опции, а не "Выход". Однако, если я нажму на ссылку, она перенаправит меня на /profile, потому что это то, что говорит это приложение, если я вошел в систему. Таким образом, ясно, что я вошел в систему, но шаблон не является readint user.is_authenticated как true.
Вид, относящийся к запросам на вход:
def LoginRequest(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/profile/')
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
profile = authenticate(username=username, password=password)
if profile is not None:
login(request, profile)
return HttpResponseRedirect('/profile/')
else:
return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request))
else:
return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request))
else:
''' user is not submitting the form, show them login form '''
form = LoginForm()
context = {'form': form}
return render_to_response('template/login.html', context, context_instance = RequestContext(request))
Ответы
Ответ 1
Если обработчик контекста auth включен, то user
уже находится в контексте шаблона, и вы можете сделать:
{% if user.is_authenticated %}
Если вы хотите получить доступ к request
в шаблоне, убедитесь, что вы включили обработчик контекстного запроса.
В вашем вопросе вы используете render_to_response
. С тех пор, как Django 1.3, лучше использовать render
вместо render_to_response
. Использование render_to_response
с RequestContext(request)
работает в Django <= 1.9, но с Django 1.10 вперед вы должны использовать ярлык render
, если вы хотите, чтобы обработчики контекста работали.
return render(request, 'template/login.html' context)
Ответ 2
Имейте в виду, что поскольку Django 1.10 is_authenticated
украшен @property, и это поведение отличается.
Для UNAUTHENTICATED, вызывающего {{user.is_authenticated}} результат:
CallableBool(True)
(когда на Django < 1.10 было True
)
Для АВТОРИЗАЦИЯ, вызывающего {{user.is_authenticated}} пользователя:
CallableBool(False)
(когда на Django < 1.10 было False
)
Если вам нужно передать, например, ваше значение javascript, например True
или False
, вы можете сделать это с помощью фильтра |yesno:"true,false"
<script language="javascript">
var DJANGO_USER = "{{user.is_authenticated|yesno:"true,false"}}";
</script>