2012-10-25 3 views
0

У меня есть одна проблема с меню пользователей. Итак, я хочу, чтобы аутентифицированный пользователь мог видеть страницу своего профиля и выйти из системы (ссылки) в меню. Он работает (при входе) на индексной странице: index, page1, profile, logout, но, если я иду, например, на стр. 1, я могу видеть в меню: index, page1, login, а не профиль и выход из системы. Как это исправить?Аутентификация пользователя в Django. Проблемы с is_authenticated

в URLs:

url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login'), 
url(r'^accounts/profile/$', 'my_app.views.profile'), 

в представлениях:

def profile(request): 
    if not request.user.is_authenticated(): 
     return HttpResponseRedirect("/accounts/login/")   
    else: 
     user = request.user.is_authenticated() 
     return render_to_response('profile.html',locals()) 

Часть index.html:

{% if user.is_authenticated or request.user.is_authenticated %} 
    <li><a href="/accounts/profile/">Profile</a></li> 
    <li><a href="/accounts/logout/">logout</a></li> 
{% else %} 
    <li><a href="/accounts/login/">login</a></li> 
{% endif %} 

login.html:

{% extends "index.html" %} 
{% load url from future %} 

{% block application %} 

{% if form.errors %} 
<p>Try one more time</p> 
{% endif %} 

<form method="post" action="{% url 'django.contrib.auth.views.login' %}"> 
{% csrf_token %} 
<table> 
<tr> 
    <td>{{ form.username.label_tag }}</td> 
    <td>{{ form.username }}</td> 
</tr> 
<tr> 
    <td>{{ form.password.label_tag }}</td> 
    <td>{{ form.password }}</td> 
</tr> 
</table> 

<input type="submit" value="Login" /> 
<input type="hidden" name="next" value="{{ next }}" /> 
</form> 

{% endblock %} 

profile.html:

{% extends "index.html" %} 
{% block application %} 
{% if request.user.is_authenticated %} 
    <p>Welcome, {{ request.user.username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 
{% endblock %} 

page1.html:

{% extends "index.html" %} 
{% block application %} 
some for loops here 
{% endblock %} 

просмотров за page1:

def car(request): 
    all_cars = Car.objects.all().filter(active=1).values('id', 'name') 
    return render_to_response('page1.html', {'all_cars': all_cars}) 
+0

использовать кэширование ли? – madjar

+1

'user = request.user.is_authenticated()' - он возвращает True или False, не так ли? Может быть, 'user = request.user'? – Marboni

+0

@madjar, no. @Marboni, 'user = request.user' - заменить во всех файлах? – tim

ответ

0

Вам не нужно вручную передать user при визуализации шаблона. Попытайтесь это сделать.

В view.py:

from django.contrib.auth.decorators import login_required 
from django.shortcuts import render 

@login_required 
def profile(request): 
    return render(request, 'profile.html') 

В settings.py

LOGIN_URL = '/accounts/login/' 

В index.html:

{% if user.is_authenticated %} 
    <li><a href="/accounts/profile/">Profile</a></li> 
    <li><a href="/accounts/logout/">logout</a></li> 
{% else %} 
    <li><a href="/accounts/login/">login</a></li> 
{% endif %} 

В profile.html

{% extends "index.html" %} 
{% block application %} 
{% if user.is_authenticated %} 
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 
{% endblock %} 

Ввиду стр.1:

from django.shortcuts import render 
from django.contrib.auth.decorators import login_required 
# If you want only authenticated users to access this page 
@login_required 
def car(request): 
    all_cars = Car.objects.all().filter(active=1).values('id', 'name') 
    return render(request, 'page1.html', {'all_cars': all_cars}) 

PS: I strongly suggest you to use named urls and use url names instead of hardcoding urls.

+0

У меня есть эта ошибка: ** Нет модуля с именем auth.decorators ** – tim

+0

извините, что это django.contrib.auth.decorators –

+0

поэтому я использую ваш код. Когда я регистрируюсь, в index.html (главная страница) я могу видеть ссылки аннотации профиля anf. Но если я перейду на страницу «page1», я вижу только ссылку «login». – tim

0

Всегда добавляйте context_instance:

render_to_response('profile.html',locals(), context_instance=RequestContext(request)) 
+0

Еще лучше: используйте 'render' (https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render). – madjar

+0

в 'if' из profile.html и index.html Я использую 'request.user'. Я могу регистрироваться, но если я перейду к другим ссылкам (стр. 1 и т. Д.), Мне нужно снова войти в систему – tim

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