2010-05-16 3 views
2

В моем файле base.html я использую
{% if user.is_authenticated %}
<a href="#">{{user.username}}</a>
{% else %} <a href="/acc/login/">log in</a>

Здесь, даже если пользователь вошел в систему, журнал в кнопке показывает вверх.аутентификации Django

Теперь, когда я нажимаю на log in ссылку, он показывает имя пользователя, а также нормальный вид входа в систему, говоря пользователь вошел в систему.

Итак, что случилось?

ответ

5

Похоже, вы не получаете никакой информации о пользователе в своих шаблонах. Вам нужно 'django.contrib.auth.middleware.AuthenticationMiddleware' в настройках MIDDLEWARE_CLASSES, и получить это добро в контекст для ваших шаблонов, вам нужно сделать:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def my_view(request): 
    return render_to_response('my_template.html', 
           my_data_dictionary, 
           context_instance=RequestContext(request)) 

Чтобы спасти вас делать это везде, рассмотреть возможность использования django-annoying'srender_to декоратор вместо render_to_response.

@render_to('template.html') 
def foo(request): 
    bar = Bar.object.all() 
    return {'bar': bar} 

# equals to 
def foo(request): 
    bar = Bar.object.all() 
    return render_to_response('template.html', 
           {'bar': bar}, 
           context_instance=RequestContext(request)) 
+0

Спасибо, Доминик Р. Еще одна вещь, поэтому, мне нужно включить 'context_instance' во всех моих взглядов, если мне нужно сделать это всегда (например, показать «войти в систему» ​​информацию в заголовке)? Разве нет лучшего способа сделать это, если я всегда хочу это сделать. Надеюсь, я поняла. – zubinmehta

+0

@webvulture - взгляните на django-annoying (см. Мое редактирование). Я знаю, что мнения различаются в зависимости от того, является ли декоратор 'render_to' злом, но я склонен считать его полезным. Не используйте его, если ваше представление всегда будет делать что-либо, кроме рендеринга этого шаблона. –

1

Я уверен, что ответ Доминика Роджера решает вашу проблему. Просто хотел бы добавить, что я лично предпочитаю, чтобы импортировать direct_to_template вместо render_to_response:

from django.views.generic.simple import direct_to_template 
... 
return direct_to_template(request, 'my_template.html', my_data_dictionary) 

, но я предполагаю, что это просто дело вкуса. В моем случае, вы также можете использовать именованные параметры вместо my_data_dictionary:

return direct_to_template(request, 'template.html', foo=qux, bar=quux, ...) 
Смежные вопросы