Django user.is_authenticated работает в некоторых местах, а не в других - PullRequest
5 голосов
/ 26 июля 2010

В моем шаблоне у меня есть следующее:

        <ul class="tabbed" id="network-tabs">
            {% if user.is_authenticated %}
            <li><a href="{% url acct-my-profile %}">My Account</a></li>
            <li><a href="{% url acct-logout %}">Log Out</a></li>
            {% else %}
            <li><a href="{% url acct-login %}">Log in</a></li>
            <li><a href="{% url acct-register %}">Register</a></li>
            {% endif %}
        </ul>

Кажется, что работает нормально, если только созданная страница не имеет декоратора @login_required, в этом случае страница работает нормально, но навигация выглядит так, как будто пользователь не вошел в систему, даже если они есть.

Ответы [ 2 ]

13 голосов
/ 27 июля 2010

Вам следует проверить функцию просмотра, чтобы увидеть, откуда берется переменная user. Если вы специально не передаете user в контекст из представления, это ваша проблема.

Вы делаете , тем не менее, имеете доступ к request.user, и это всегда будет возвращать true в шаблоне, отображаемом из представления с декоратором @login_required.

Причина, по которой я могу с уверенностью сказать, что с декоратором нет ничего плохого, заключается в том, что в коде для User и AnonymousUser (расположенном в django.contrib.auth.models) метод is_authenticated строго возвращает true для User и false для AnonymousUser. Декоратор этого не меняет и не может изменить. И это означает, что ваш шаблон на самом деле не получает объект User, где вы проверяете user.

8 голосов
/ 27 июля 2010

Если следовать ответу Габриэля, переменная user поступает от процессора контекста аутентификации? Если это так, и вы используете ярлык render_to_response, вам нужно использовать экземпляр RequestContext.

from django.template import RequestContext

...

@login_required
def some_view(request):
    # ...
    return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))
...