Django 模板标签 + 带有 user.is_authenticated 的模板不起作用
-
21-09-2019 - |
题
我有一个奇怪的问题,在我的设置文件中,需要启用模板中 user.is_authenticated 使用的所有内容。
我有以下模板标签代码:
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 )
模板(menu.html)如下:
{% 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 %}
但即使我登录了它总是返回未登录...有人知道这段代码有什么问题吗?
提前致谢。
问候,bloeper
解决方案 3
所有感谢所有帮助的第一位。 我找到了解决办法感谢大家:) 原来我需要传递请求对象的每一个观点,并把它作为我的模板标签的参数需要。 溶液代码:
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 )
感谢人的帮助:)
其他提示
你有的Django .core.context_processors.auth 在 TEMPLATE_CONTEXT_PROCESSORS 一>设置?
试试另一件事情是你render_to_reponse语法。根据该文档,它应该是
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
您是否注册了其他上下文处理器?他们设置吗 user
?
我建议在开发服务器下运行并执行以下操作:
rc = RequestContext(request, ... params ...)
user = rc.get('user')
print user.username, user.is_authenticated()
如果您没有获得预期的值,那么您需要进行更深入的挖掘。以下内容应遍历所有上下文字典并显示哪些字典包含“user”值。第一个是模板所看到的。
rc = RequestContext(request, ... params ...)
for d in rc:
print d
你有没有在你的设置django.contrib.auth和django.contrib.sessions文件?
其中是检查,如果用户被认证的实际代码?如果您在模板检查,你应该从视图模板传递参数时提供一些indivcation。 对我来说,它的工作原理,当我做到这一点的顶部:
from django.contrib.auth.decorators import login_required
和装饰的所有视图,其中是很重要的,e.g:
@login_required
def get_hoofd_menu( ):
这一切都在概述(一个提到小上述中途)
不隶属于 StackOverflow