2014-12-05 5 views
0

Итак, я хочу показать пользователям, которые не вошли в систему, и не регистрировались в разных меню.Django, помня, что пользователь вошел в систему

Если пользователь не вошел в систему (Логин, Регистрация)

Если он уже вошел в систему: (Main, Мой раздел, Выход)

views.py:

@csrf_protect 
def loginn(request): 
c = {} 
c.update(csrf(request)) 
return render_to_response("login/login.html",c) 


@csrf_protect 
def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return render_to_response('login/loggedin.html',RequestContext(request)) 
    else: 
     return HttpResponseRedirect('/posts/invalid') 

и шаблон:

{% block Menu %} 
{% if not request.user.is_authenticated %} 
    <li> <a href="/posts/login">Login</a> </li> 
    <li> <a href="/posts/register/">Register</a></li> 
{% endif %} 

{% if request.user.is_authenticated %} 
     <li><a href="/posts">Main</a></li> 
     <li><a href="#">My profile</a></li> 
     <li><a href="/posts/logout">logout</a></li> 
    {% endif %} 
{% endblock %} 

Когда в моей странице Логин я нажимаю на Submit, на следующей странице он прекрасно работает. Существует опция меню для зарегистрированных пользователей. Но тогда, что бы я ни сделал (обновите страницу, перейдите на главную страницу и т. Д.). Я увижу пункт меню для неавторизованных пользователей.

Я прочитал Джанго документацию для аутентификации пользователей, и теперь я знаю, что {% if user.is_authenticated %} в шаблонах работает только с RequestContext и если я получаю это право, нет никакого способа, чтобы сделать то, что я хочу этот путь.

Я хочу, чтобы Django помнил, что пользователь регистрируется во все времена независимо от того, что я делаю (обновляющая страница, нажатие ссылок и т. Д.) Есть ли способ сделать это в Django?

Итак, как я могу запомнить, что пользователь вошел в систему и использовал его в шаблоне?

Возможно, есть еще один способ запомнить, что пользователь вошел в систему и использовал его в шаблоне? Что-то с сеансами, cookis и т. Д.?

p.s. извините за мой плохой английский

+1

попробуйте использовать user.is_authenticated только вместо request.user.is_authenticated –

+0

вместо использования 'render_to_response' use' render' –

+0

@vijayshanker Я пробовал это раньше, проблема остается прежней. –

ответ

2

Первый пункт: чтобы убедиться, что у вас работают процессоры контекста, вы должны использовать RequestContext во всех своих взглядах. Самый простой способ - использовать ярлык render() (https://docs.djangoproject.com/en/1.6/topics/http/shortcuts/#render) вместо render_to_response().

Второй пункт: HTTP - протокол без учета состояния, поэтому для вашего приложения, чтобы помнить что-либо между запросами, вам нужна поддержка сеанса. Из того, что вы описали, я сильно подозреваю, что вы забыли включить SessionMiddleware (cf https://docs.djangoproject.com/en/1.6/topics/auth/).

+0

Однако, если я использую 'RequestContent' во всех своих представлениях, у меня все еще будет проблема с обновлением страницы и прямой ссылкой на главную страницу. «django.contrib.sessions.middleware.SessionMiddleware» находится в settings.py –

+0

Использование 'RequestContext' не решит проблему с сеансами, но только убедитесь, что у вас есть доступ к запросу во всех ваших шаблонах. Wrt/sessions, это немного больше, чем просто включение промежуточного программного обеспечения - вам также необходимо настроить сервер сеанса (https://docs.djangoproject.com/en/1.6/topics/http/sessions/#configuring-the- сеансовый двигатель). Сначала убедитесь, что у вас все правильно настроено, таблица сеансов создана, если вы используете бэкэнд db и т. Д. –

+0

спасибо, теперь я знаю, что не так! –

Смежные вопросы