Django模板中user.is_authenticated失效,需在哪导入相关内容?
解决Django Inclusion Tag中user.is_authenticated不生效的问题
嘿,我来帮你搞定这个问题!你遇到的核心问题是:默认情况下,Django的inclusion_tag不会自动传递当前请求的上下文(包括user对象),所以你的模板里拿不到user变量,自然user.is_authenticated就失效了。
最简单的修复方法
你只需要修改menu_tags.py中的模板标签定义,让它接收上下文并把user传递给模板:
修改后的menu_tags.py代码:
from django import template from menu.models import Button register = template.Library() # 给inclusion_tag加上takes_context=True参数 @register.inclusion_tag('menu/home.html', takes_context=True) def show_menu(context): buttons = Button.objects.all() # 从上下文里取出user,传递给模板 return { 'buttons': buttons, 'user': context['user'] }
为什么这样管用?
takes_context=True告诉Django:这个模板标签需要访问当前的模板上下文(里面包含了request、user这些全局变量)。- 函数的第一个参数变成
context,我们从里面取出user对象,再把它放到返回的字典里,这样你的home.html模板就能正常访问user.is_authenticated了。
更灵活的备选方案
如果你想让模板能用到上下文里的所有变量(不只是user),可以直接把buttons添加到上下文里再返回:
@register.inclusion_tag('menu/home.html', takes_context=True) def show_menu(context): context['buttons'] = Button.objects.all() return context
这样你的模板不仅能用user,还能用到其他已经在上下文里的变量,比如request、messages等。
验证一下
修改完代码后,重启你的Django服务,再刷新页面,模板里的{% if user.is_authenticated %}就能正常判断用户是否登录了。
内容的提问来源于stack exchange,提问作者BronzoDev
相关产品推荐
相关产品推荐

