2013-06-10 11 views
24

Przepraszamy, jeśli próbowałeś mi pomóc, gdy zapytałem o to wcześniej. Musiałem usunąć to pytanie, ponieważ nie mogłem z jakiegoś powodu edytować dodatkowych informacji.Masz problemy z user.is_authenticated w szablonie django

Pracuję nad wdrożeniem uwierzytelniania użytkownika w mojej witrynie django. Wszystko działa poprawnie. Moje widoki, modele, adresy URL itp. Są skonfigurowane. Użytkownicy mogą się rejestrować, logować, wylogowywać. Problem mam z tym jest trochę kodu:

{% if request.user.is_authenticated %} 
     <li><a href="/logout">Log Out</a></li> 
     {% else %} 
     <li><a href="/login">Log In</a></li> 
     {% endif %} 

Nawet kiedy jestem zalogowany, to nadal jest wyświetlanie „Zaloguj” jako opcja zamiast „Wyloguj”. Jednak jeśli kliknę link, przekieruje mnie on/profile, ponieważ jest to tym, co widok powie, że powinienem zrobić, jeśli jestem zalogowany. Więc, oczywiście, wie, że jestem zalogowany, ale szablon nie jest readint user.is_authenticated jako true.

Widok odnoszące się zalogować żądania to:

def LoginRequest(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/profile/') 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      profile = authenticate(username=username, password=password) 
      if profile is not None: 
       login(request, profile) 
       return HttpResponseRedirect('/profile/') 
      else: 
       return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
     else: 
      return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
    else: 
     ''' user is not submitting the form, show them login form ''' 
     form = LoginForm() 
     context = {'form': form} 
     return render_to_response('template/login.html', context, context_instance = RequestContext(request)) 

Odpowiedz

40

Jeśli procesor kontekst auth jest włączone, a następnie user jest już w kontekście szablonu, można zrobić:

{% if user.is_authenticated %} 

Jeśli chcesz uzyskać dostęp do szablonu request, upewnij się, że włączono request context processor.

W swoim pytaniu używasz render_to_response. Od czasów Django 1.3 lepiej jest używać render zamiast render_to_response. Używanie render_to_response z działa w Django < = 1.9, ale od wersji Django 1.10 musisz użyć skrótu render, jeśli chcesz, aby procesory kontekstowe działały.

return render(request, 'template/login.html', context) 
+0

Moi procesory kontekst szablon są ("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.tz ", " django.contrib.messages.context_processors.messages ") jaka jest ścieżka do żądania jednego? – Xonal

+0

Ścieżka podana jest w dokumentach, z którymi się łączyłem. – Alasdair

+0

Och, nie zdawałem sobie sprawy, że zostawiłem prośbę. user.is_authenticated w. Próbowałem go dodać, bo myślałem, że to pomoże, ale nie. Szablon nie działa z lub bez "request" tam – Xonal

4

Należy pamiętać, że od Django 1.10is_authenticated zdobią @property i zachowanie różni.

Dla Nieuwierzytelnieni użytkownik wywołujący {{user.is_authenticated}} wyniki:

CallableBool(True) (kiedy na Django < 1,10 było True)

Na uwierzytelnionych wywoływania użytkownika {{user.is_authenticated} } wyniki:

CallableBool(False) (kiedy na Django < 1,10 było False)

Jeśli trzeba przejść na przykład do wartości javascript jak true lub false można zrobić to z zastosowaniem filtra |yesno:"true,false"

<script language="javascript"> 
var DJANGO_USER = "{{user.is_authenticated|yesno:"true,false"}}"; 
</script> 
Powiązane problemy