【问题标题】:Django template tag + template with user.is_authenticated doesn't work带有 user.is_authenticated 的 Django 模板标签 + 模板不起作用
【发布时间】:2011-01-06 02:23:54
【问题描述】:

我有一个奇怪的问题,在我的设置文件中,所有需要启用 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 %}

但它总是返回 Not logged in 即使我已登录... 有人知道这段代码有什么问题吗?

提前致谢。

您好, 吹牛

【问题讨论】:

  • 更新:代码是一样的(我发布的那个......但现在我得到一个错误......所以它是改进的。它说:渲染时捕获异常:全局名称'request'未定义那是在响应部分的渲染中:)

标签: django templates templatetag


【解决方案1】:

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

要尝试的另一件事是您的 render_to_reponse 语法。根据文档,它应该是

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

【讨论】:

  • 是的,我的设置文件中有所有必要的东西(据我所知,我可以在 django 文档中阅读它
  • (添加了另一个要检查的内容)
  • 好吧,首先是代码...但是我尝试了这种方式没有用。
【解决方案2】:

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

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

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

如果您没有得到您期望的值,那么您需要更深入地挖掘。以下内容应遍历所有上下文字典并向您展示哪些包含“用户”的值。第一个将是模板看到的内容。

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

【讨论】:

  • 我正在运行开发服务器,但是当我在其中打印某些内容时,我在控制台中看不到它。我只运行默认的上下文处理器
  • 嗯...你应该看到一些东西。尝试在视图的开头添加一个简单的print "Foo!"。如果这没有显示,那么有些事情很奇怪。另外,什么平台(Windows、Linux、Mac)?哪个 Python 版本?哪个 Django 版本?
  • print "x" 也不起作用.. 它不是一个视图,它是一个模板标签。我在 linux 上工作,使用 python 2.6 和 django 版本 1.1.1 hmm 现在确实返回了东西:S
  • 对不起,我不清楚。上面的代码需要在视图中完成。您必须知道进入模板引擎的上下文值是它们需要的。如果进去不正确,那么出来的基本上就是鳄梨酱。此外,您没有从模板标签处理中获取打印值也很奇怪。我刚刚从我的内部打印支票,它们在控制台上打印出来就好了。
【解决方案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 )

感谢大家的帮助:)

【讨论】:

  • 但是你如何在模板中调用你的标签,你需要给它一个请求参数! {% get_hoofd_menu request%} 对吗?你如何在模板中获取请求??
【解决方案4】:

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

【讨论】:

  • 是的,两者都在我的已安装应用列表中
  • 奇怪。你确定你登录了吗?你是用 login() 函数登录的吗?
  • 是的,我确定我已登录,我使用登录功能。但是当我将 if user.is_authenticated 更改为 if not user..... 然后我总是收到 Jeeej 登录的消息。所以 user.is_authenticated 不能正常工作。
  • 很奇怪,很奇怪。我现在什么都没有。抱歉...编辑:也许您可以尝试 request.user.is_authenticated 而不是 user.is_authenticated ?
【解决方案5】:

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

from django.contrib.auth.decorators import login_required

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

@login_required
def get_hoofd_menu( ):

overview里都提到了(略高于中途)

【讨论】:

  • 这不是我的意思...这不是视图...这是一个模板标签,并且不需要登录,我只将它用于需要登录的一些项目。
  • 我忘了提到您必须将包含用户的请求传递给视图,以便它也可以传递给模板(即将视图定义为“get_hoofd_menu(request):” ),也许这是重要的部分
猜你喜欢
  • 2011-04-28
  • 2016-03-22
  • 1970-01-01
  • 2012-12-02
  • 2016-01-22
  • 2012-08-23
  • 2019-06-24
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多