2015-11-03 2 views
0

Dans ma petite webapp Django, j'ai 4 ou 5 vues/pages. J'ai ajouté l'authentification sur chaque fonction, en la préfixant par @login_required().jinja var pas passé au modèle

Sur toutes les pages, je peux afficher la variable user.username avec Jinja2.

Mais seulement sur une page (displaystats.html), la variable utilisateur est introuvable ou vide ...

Voici mon avis:

@login_required() 
def displaystats(request): 
    try: 
     listpackages = Packages.objects.all().order_by('-id') 
    except: 
     listpackages = None 

    try: 
     listprojects = Projects.objects.all() 
    except Projects.DoesNotExist: 
     listprojects = None 

return render_to_response('displaystats.html', {'listpackages': listpackages}) 

modèles sont simples: - displaystats. html

<!DOCTYPE html> 
<html> 
    <!-- Head --> 
    {% include 'head.html' %} 
    <body> 
    <!-- Navbar --> 
    {% with "Dynamic Packages Statistics" as namepage %} 
     {% include 'navbar.html' %} 
    {% endwith %} 
... 
... 

navbar.html:

<!-- Navbar --> 
<nav class="navbar navbar-default navbar-static-top" role="navigation"> 
    <a class="navbar-brand" href="{% url 'webgui.views.homepage' %}"> MyAPP </a> <p class="navbar-text">{{ namepage }}</p> 

{% if user %} 
    <p class="btn btn-default navbar-btn pull-right" style="margin-right:15px;"> Welcome, {{ user.username }} </p> 
    <a href="{% url 'logout' %}" class="btn btn-danger navbar-btn pull-right" style="margin-right:15px;"><span class="glyphicon glyphicon-log-out"> Logout </span></a> 
{% else %} 
    <p class="btn navbar-btn pull-right" style="margin-right:15px;"> Welcome, you're unlogged </p> 
{% endif %} 

J'ai essayé de commenter certaines des lignes (HTML, changement jinja2 « si », ...) mais la page displaystats.html ne savent pas la variable « utilisateur » et je ne comprends pas pourquoi.

Répondre

1

Cela n'a rien à voir avec le décorateur login_required ou jinja2, le problème est à votre avis. Vous devez utiliser le raccourci render au lieu de render_to_response.

from django.shortcuts import render 

@login_required() 
def displaystats(request): 
    ... 
    return render(request, 'displaystats.html', {'listpackages': listpackages}) 

Lorsque vous utilisez render_to_response vous devez utiliser explicitement un RequestContext afin que les pistes de processeur de contexte auth et comprend user dans le contexte du modèle. Le raccourci render le fait automatiquement.

+0

Oh oui cela fonctionne avec 'render'. Et merci pour l'explication, cela pourrait être utile :) – Isador