Python 如何在django模板中检查TEMPLATE_DEBUG标志?

Python 如何在django模板中检查TEMPLATE_DEBUG标志?,python,django,templates,Python,Django,Templates,您知道是否可以在django模板中知道是否设置了template_DEBUG标志吗 我想在我的开发机器上运行django应用程序时禁用我的google analytics脚本。类似于{%if debug%}模板标记的东西将是完美的。不幸的是,我在文档中没有找到类似的内容 当然,我可以将此标志添加到上下文中,但我想知道是否有更好的方法。您需要将DEBUG标志添加到context\u处理器中 甚至可能没有别的办法。至少,据我所知没有。假设您没有在settings.py中将TEMPLATE\u CON

您知道是否可以在django模板中知道是否设置了template_DEBUG标志吗

我想在我的开发机器上运行django应用程序时禁用我的google analytics脚本。类似于{%if debug%}模板标记的东西将是完美的。不幸的是,我在文档中没有找到类似的内容


当然,我可以将此标志添加到上下文中,但我想知道是否有更好的方法。

您需要将
DEBUG
标志添加到
context\u处理器中


甚至可能没有别的办法。至少,据我所知没有。

假设您没有在
settings.py
中将
TEMPLATE\u CONTEXT\u PROCESSORS
设置为其他值,Django将自动加载
debug
上下文预处理器(如上所述)。这意味着您将有权访问模板中名为
debug
的变量,前提是
设置。debug
为true,并且在变量
设置中设置了本地计算机的IP地址(可以是127.0.0.1)。INTERNAL_IPS
(已描述)<代码>设置。内部IP是Django应该识别为“内部”的IP地址元组或列表。

如果您还没有,查看其他人是否/如何处理Django代码段上的相同问题总是有帮助的。使用analytics标记的最新代码段是1656:

此解决方案的好处在于,它允许您将您的
GOOGLE\u ANALYTICS\u code=xxxxxx
保存在local\u settings.py中。如果您的源代码的其余部分是公共的,您的密钥仍然是私有的。此外,它还采取了一个额外的步骤,不使用登录用户的分析

包括谷歌分析的Javascript。当调试打开时,不会显示Google Analytics代码,也不会向工作人员用户显示

在模板中使用
{%googleanalyticsjs%}

你必须设置一个类似

GOOGLE_ANALYTICS_CODE = "UA-1234567-1"
在您的设置文件中

假设模板变量中的“user”是
request.user
,如果使用:

return render_to_response('template.html',{ }, context_instance=RequestContext(request))
(假设
django.core.context\u processors.auth
位于
TEMPLATE\u context\u processors
中,默认情况下是这样)


来自django导入模板的

导入设置
register=template.Library()
类ShowGoogleAnalyticsJS(template.Node):
def呈现(自身、上下文):
code=getattr(设置,“谷歌分析代码”,False)
如果不是代码:
返回“”
如果上下文和上下文['user']中的'user'和上下文['user']中的'user',则
返回“”
如果设置为.DEBUG:
返回“”
返回“”
var gaJsHost=((“https:==document.location.protocol)?”https://ssl." : "http://www.");
document.write(unescape(“%3Cscript src=”)+gaJsHost+“google analytics.com/ga.js”
type='text/javascript'%3E%3C/script%3E');
试一试{
var pageTracker=_gat._getTracker(“”“”+str(代码)+“”);
页面跟踪器。_trackPageview();
}捕获(错误){}
"""
def googleanalyticsjs(解析器、令牌):
返回ShowGoogleAnalyticsJS()
show_common_data=register.tag(googleanalyticsjs)

如果无法/不适合修改
内部\u IPS
,可以使用上下文处理器执行此操作:

myapp/context\u processors.py
中:

from django.conf import settings

def debug(context):
  return {'DEBUG': settings.DEBUG}
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.debug',
)
settings.py
中:

from django.conf import settings

def debug(context):
  return {'DEBUG': settings.DEBUG}
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.debug',
)
然后在我的模板中,只需:

 {% if DEBUG %} .header { background:#f00; } {% endif %}

Django 1.9+

settings.py:

INTERNAL_IPS = (
    '127.0.0.1',
)
模板:

{% if debug %}
说:

IP地址的列表,作为字符串,用于:

  • 允许debug()上下文处理器向模板上下文添加一些变量

debug
上下文处理器处于默认的
设置中。py

{%if debug%}
可以执行此操作,但前提是您传递的是
RequestContext
而不是
context
。此外,
debug
不是一个布尔标志,它是一个函数,当
debug=True
返回一些调试信息时进行计算。对于模板来说,这可能是不必要的开销

就我个人而言,我做的是这个把戏

{% if request.META.HTTP_HOST == "127.0.0.1:8000" %}

这将始终有效,但不依赖于调试标志和内部IP,它只适用于硬编码IP。

它似乎符合我的需要,但不幸的是,它不适用于我。我找不到哪里出了问题。只要我使用RequestContext而不是Context,这就可以很好地工作。谢谢!哎呀,对不起!我忘了提到您必须将
RequestContext
传递给模板。您如何在模板中检查它?根据文档,ifequal是不够的:只能将参数与模板变量或字符串进行比较。不能检查与Python对象(如True或False)的相等性。如果您需要测试某事是否正确,请使用If标记。但是,{%if%}不起作用。它检查是否存在,而不是它是真是假。在Django文档中:“标记
{%if%}
计算一个变量,如果该变量为'true'(即存在,不为空,并且不是一个假布尔值),则输出块的内容。”我没有找到这方面的任何文档,而且在Django 1.6之前似乎不需要它。。我觉得这有点过时了,有什么解释吗?我是否需要将任何特定设置加载到上下文中?我想这不是很方便。。谢谢你的提示,下面的答案被低估了。现在使用django,您可以使它变得更简单:最好使用
takes_context=True
将其移动到模板标记,以避免违反DRY命令。整个Django可以说是一个黑客!:-)(我认为这很好,但我不是100%)对django 2.1.8迄今为止最好的解决方案感到满意