Django login_required проходит, но затем user.is_authenticated не работает в шаблоне (??)

Эта функция просмотра:

@login_required 
def dashboard(request):
    from myproject.myapp.models import UserProfile
    k = UserProfile.objects.get( user=request.user.pk ).known

    return render_to_response('dashboard.html', {'KNOWN': k, , context_instance=RequestContext(request))

Переходит к этому шаблону:

{% if user.is_authenticated %}
    {{ user.username }}
{% else %}
    Login link
{% endif %}
    {{ KNOWN }}
  1. Я уже авторизовался.
  2. Страница не перенаправляется на LOGIN_URL (поэтому @login_required думает, что я вошел в систему, я думаю)
  3. {{ ИЗВЕСТНО }} отображается отлично
  4. {{ user.username }} не отображается

Как это возможно? Конечно, если login_required работает, и ему удалось получить ИЗВЕСТНОЕ, значит, пользователь должен где-то существовать?
Как я могу это отладить?

:-)


ОБНОВЛЕНИЕ: если я удалю:

TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',)

В настройках это работает.
Однако при удалении другие страницы, использующие {{ request.get_full_path }} в шаблонах, не загружаются.
Эх.


ОБНОВЛЕНИЕ 2:

TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.request",)

Если вы просто добавите строку запроса отдельно, она отключит все остальные, которые используются по умолчанию. Д'О!


ОБНОВЛЕНИЕ 3: Думал, что это исправит, к сожалению, все еще не работает.


ОБНОВЛЕНИЕ 4: Замеченная опечатка в другом месте может подтвердить, что ответ Марка Лавина исправил ее :)


person LittleBobbyTables    schedule 01.03.2012    source источник


Ответы (2)


Если вы устанавливаете TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',), вы удаляете все обработчики контекста по умолчанию, в частности django.contrib.auth.context_processors.auth, который добавляет user к контексту. Вместо этого вы должны использовать

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.contrib.messages.context_processors.messages",
    "django.core.context_processors.request",
)
person Mark Lavin    schedule 01.03.2012

Вы должны сохранить django.core.context_processors.request, он позволяет использовать {{ request }} в шаблонах.

Объект запроса имеет пользовательское свойство, которое должно соответствовать пользователю, запрашивающему страницу.

Попробуйте это, это должно сработать и для вас:

{% if request.user.is_authenticated %}
    you're authenticated as {{ request.user.username }}
{% else %}
    i'm a guest
{% endif %}
person jpic    schedule 01.03.2012