Tag do modelo django + modelo com user.is_authenticated não funciona
-
21-09-2019 - |
Pergunta
Eu tenho um problema estranho, no meu arquivo de configurações, tudo está ativado que precisa ser ativado para user.is_authenticated Uso em um modelo.
Eu tenho o seguinte código de tag de modelo:
from django import template
from progmatic.cms.models import navigation, navigation_item
from django.template.defaultfilters import slugify
from django.shortcuts import render_to_response
from django.template import RequestContext
register = template.Library()
""" Gets the menu items you have entered in the admin.
No arguments are accpeted"""
def get_hoofd_menu( ):
menu = navigation.objects.get( slug = "hoofd-menu");
mcontent = navigation_item.objects.filter( parent_menu = menu);
return { 'mcontent' : mcontent }
def get_sub_menu( menu ):
menu = navigation.objects.get( slug = slugify(menu) )
mcontent = navigation_item.objects.filter( parent_menu = menu )
c = RequestContext( request, { 'mcontent': mcontent,} )
return render_to_reponse('menu.html', RequestContext(request, { 'mcontent' : mcontent }) )
register.inclusion_tag('menu.html')( get_hoofd_menu )
register.inclusion_tag('menu.html')( get_sub_menu )
E o modelo (menu.html) é o seguinte:
{% block mainmenu %}
<ul>
{% for content in mcontent %}
{% if content.login_required %}
{% if content.to_page %}
<li><a href="/page/{{ content.to_page_slug }}">{{ content.name }}</a></li>
{% endif %}
{% if content.to_url %}
{% if content.external %}
<li><a href="{{ content.to_url }}" rel="external">{{ content.name }}</a></li>
{% else %}
<li><a href="{{ content.to_url }}">{{ content.name }}</a></li>
{% endif %}
{% endif %}
{% else %}
{% if content.to_page %}
<li><a href="/page/{{ content.to_page_slug }}">{{ content.name }}</a></li>
{% endif %}
{% if content.to_url %}
{% if content.external %}
<li><a href="{{ content.to_url }}" rel="external">{{ content.name }}</a></li>
{% else %}
<li><a href="{{ content.to_url }}">{{ content.name }}</a></li>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</ul>
{% if user.is_authenticated %}
JEEEEEEEJ LOGGED IN
{% else %}
Not logged in
{% endif %}
{% endblock %}
Mas sempre retorna não conectado, mesmo quando estou conectado ... alguém tem uma pista do que há de errado com esse código?
Desde já, obrigado.
Saudações, Blagem
Solução 3
Primeiro de tudo, obrigado por toda a ajuda. Encontrei a solução graças a todos vocês :) Acontece que eu precisava passar o objeto de solicitação em todas as visões e precisava colocá -lo como um argumento na minha tag de modelo. Código da solução:
from django import template
from progmatic.cms.models import navigation, navigation_item
from django.template.defaultfilters import slugify
from django.shortcuts import render_to_response
from django.template import RequestContext
from itertools import chain
register = template.Library()
""" Gets the menu items you have entered in the admin.
No arguments are accepted"""
def get_hoofd_menu( request ):
menu = navigation.objects.get( slug = "hoofd-menu");
mcontent = navigation_item.objects.filter( parent_menu = menu, login_required = False);
if request.user.is_authenticated and not request.user.is_anonymous():
mmcontent = navigation_item.objects.filter( parent_menu = menu, login_required = True )
else:
mmcontent = ""
final_menu = list(chain(mcontent,mmcontent))
return { 'mcontent' : final_menu }
#return render_to_response('menu.html', { 'mcontent' : mcontent } )
def get_sub_menu( request, menu ):
menu = navigation.objects.get( slug = slugify( menu ) )
mcontent = navigation_item.objects.filter( parent_menu = menu, login_required = False )
if request.user.is_authenticated and not request.user.is_anonymous():
mmcontent = navigation_item.objects.filter( parent_menu = menu, login_required = True )
else:
mmcontent = ""
final_menu = list(chain(mcontent,mmcontent))
return { 'mcontent' : final_menu }
#return render_to_response('menu.html', { 'mcontent' : mcontent })
register.inclusion_tag('menu.html')( get_hoofd_menu )
register.inclusion_tag('menu.html')( get_sub_menu )
Obrigado por toda a ajuda :)
Outras dicas
Você tem django.core.context_processors.auth dentro Template_context_processors contexto?
Outra coisa a tentar é a sua sintaxe render_to_reponse. De acordo com os documentos, deve ser
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
Você tem outros processadores de contexto registrados? Eles definem user
?
Eu recomendo correr sob o servidor dev e fazer algo como:
rc = RequestContext(request, ... params ...)
user = rc.get('user')
print user.username, user.is_authenticated()
Se você não obtém os valores que espera, precisará se aprofundar. O seguinte deve iterar em todos os ditos de contexto e mostrar qual (s) contém um valor para o 'usuário'. O primeiro será o que o modelo vê.
rc = RequestContext(request, ... params ...)
for d in rc:
print d
Você tem django.contrib.auth e django.contrib.sessions no seu arquivo de configurações?
Onde está o código real que verifica se o usuário é autenticado? Se você verificar no modelo, forneça alguma indivicação ao passar os parâmetros da visualização para o modelo. Para mim, funciona quando eu faço isso no topo:
from django.contrib.auth.decorators import login_required
e decore todas as vistas em que é importante, por exemplo:
@login_required
def get_hoofd_menu( ):
Tudo é mencionado no visão global (um pouco acima da metade)