带有user.is_authenticated的Django模板标签+模板不起作用

时间:2010-01-17 16:14:58

标签: django templates templatetag

我有一个奇怪的问题,在我的设置文件中,所有内容都已启用,需要为模板中的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

5 个答案:

答案 0 :(得分:3)

您在django.core.context_processors.auth设置中有TEMPLATE_CONTEXT_PROCESSORS吗?

要尝试的另一件事是你的render_to_response语法。根据码头,它应该是

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))

答案 1 :(得分:2)

您是否注册了其他上下文处理器?他们设置了user吗?

我建议在开发服务器下运行并执行以下操作:

rc = RequestContext(request, ... params ...)
user = rc.get('user')
print user.username, user.is_authenticated()

如果你没有得到你期望的价值,那么你需要深入挖掘。以下内容应遍历所有上下文切片,并显示哪个(s)包含“user”的值。第一个将是模板看到的内容。

rc = RequestContext(request, ... params ...)
for d in rc:
    print d

答案 2 :(得分:2)

首先感谢所有的帮助。 我找到了解决方案,谢谢你们所有人:) 事实证明我需要在每个视图中传递请求对象,并且需要将其作为参数放在我的模板标记中。 解决方案代码:

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 )

感谢您的帮助:)

答案 3 :(得分:0)

您的设置文件中是否有django.contrib.auth和django.contrib.sessions?

答案 4 :(得分:0)

检查用户是否经过身份验证的实际代码在哪里?如果在模板中检查它,则在将参数从视图传递到模板时应该提供一些分类。 对我而言,当我在顶部执行此操作时,它会起作用:

from django.contrib.auth.decorators import login_required

并装饰所有重要的视图,例如:

@login_required
def get_hoofd_menu( ):

这一切都在overview中提到(略高于中途)