Подтвердить что ты не робот

Проблемы с 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))
4b9b3361

Ответ 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>