Django login_required проходит, но затем в шаблоне происходит сбой user.is_authenticated (??) - PullRequest
2 голосов
/ 01 марта 2012

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

@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. {{KNOWN}} прекрасно отрисовывается OK
  4. {{user.username}} не отображается

Как это возможно?Конечно, если login_required работает, и ему удалось получить KNOWN, следовательно, пользователь должен существовать где-то?
Как я могу отладить это?

: -)


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

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

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


ОБНОВЛЕНИЕ 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",)

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


ОБНОВЛЕНИЕ 3: Мысль, которая исправит это, к сожалению, все еще не работает.


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

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Если вы устанавливаете 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",
)
1 голос
/ 01 марта 2012

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

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

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

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