【问题标题】:How to check the TEMPLATE_DEBUG flag in a django template?如何检查 django 模板中的 TEMPLATE_DEBUG 标志?
【发布时间】:2010-11-19 06:55:26
【问题描述】:

你知道如果设置了 TEMPLATE_DEBUG 标志,是否可以在 django 模板中知道?

当我在我的开发机器上运行我的 django 应用程序时,我想禁用我的谷歌分析脚本。像 {% if debug %} 模板标签这样的东西是完美的。不幸的是,我在文档中没有找到类似的内容。

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

【问题讨论】:

标签: python django templates


【解决方案1】:

假设您没有在settings.py 中将TEMPLATE_CONTEXT_PROCESSORS 设置为其他值,Django 将自动加载debug 上下文预处理器(如here 所述)。这意味着您将可以访问模板中名为 debug 的变量 如果 settings.DEBUG 为真 并且 您的本地计算机的 IP 地址(可以简单地为 127.0.0)。 0.1) 设置在变量settings.INTERNAL_IPS(描述为here)中。 settings.INTERNAL_IPS 是 Django 应识别为“内部”的 IP 地址的元组或列表。

【讨论】:

  • 这似乎符合我的需要,但不幸的是它对我不起作用。我找不到问题所在。
  • 只要我使用 RequestContext 而不是 Context 就可以完美运行。非常感谢!
  • 糟糕,对不起!我确实忘了提到您必须将 RequestContext 传递给模板。
  • 如何在模板中检查它?根据文档, ifequal 是不够的:只能将参数与模板变量或字符串进行比较。您无法检查 Python 对象是否相等,例如 True 或 False。如果您需要测试某事是真还是假,请改用 if 标记。但是,{% if %} 不起作用。它检查存在,而不是它是真还是假。
  • if 标签应该起作用。来自 Django 文档:“{% if %} 标记评估一个变量,如果该变量为 'true'(即存在、不为空且不是假布尔值),则输出块的内容。”跨度>
【解决方案2】:

如果修改INTERNAL_IPS 是不可能的/不适合的,您可以使用上下文处理器来执行此操作:

myapp/context_processors.py:

from django.conf import settings

def debug(context):
  return {'DEBUG': settings.DEBUG}

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.debug',
)

然后在我的模板中,简单地说:

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

【讨论】:

  • 我没有找到任何文档,在 django 1.6 之前似乎不需要它。我觉得这有点旧,有什么解释吗?我是否需要将任何特定设置加载到上下文中?我认为这不是很方便.. 感谢您的提示
【解决方案3】:

Django 1.9+

settings.py:

INTERNAL_IPS = (
    '127.0.0.1',
)

模板:

{% if debug %}

https://docs.djangoproject.com/en/dev/ref/settings/#internal-ips 说:

字符串形式的 IP 地址列表:

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

debug 上下文处理器在默认的settings.py 中。

【讨论】:

  • @ÖzerS。整个 Django 可以说是一个 hack! :-)(我认为这很好,但我不是 100%)
  • 使用 django 2.1.8 工作正常
  • 迄今为止最好的解决方案
【解决方案4】:

如果你还没有,看看其他人是否/如何在 djangosn-ps 上处理过同样的问题总是有帮助的。最近使用分析标签的 sn-p 是 1656: http://www.djangosnippets.org/snippets/1656/

此解决方案的优点在于,它允许您将 GOOGLE_ANALYTICS_CODE = xxxxxx 保留在 local_settings.py 中,以防您的其他来源是公开的,而您的密钥仍然是私有的。此外,它还采取了一个额外的步骤,即不对登录用户使用分析。

包括用于 Google Analytics 的 Javascript。当 DEBUG 开启或向员工用户显示时,不会显示 Google Analytics 代码。

在您的模板中使用{% googleanalyticsjs %}

你必须设置类似

GOOGLE_ANALYTICS_CODE = "UA-1234567-1"

在您的设置文件中。

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

return render_to_response('template.html',{ }, context_instance=RequestContext(request))

(假设django.core.context_processors.authTEMPLATE_CONTEXT_PROCESSORS中,默认情况下)


from django import template
import settings
register = template.Library()


class ShowGoogleAnalyticsJS(template.Node):
  def render(self, context):
      code =  getattr(settings, "GOOGLE_ANALYTICS_CODE", False)
      if not code:
          return "<!-- Goggle Analytics not included because you haven't set the settings.GOOGLE_ANALYTICS_CODE variable! -->"

      if 'user' in context and context['user'] and context['user'].is_staff:
          return "<!-- Goggle Analytics not included because you are a staff user! -->"

      if settings.DEBUG:
          return "<!-- Goggle Analytics not included because you are in Debug mode! -->"

      return """
      <script type="text/javascript">
          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"));
      </script>
      <script type="text/javascript">
          try {
          var pageTracker = _gat._getTracker('""" + str(code) + """');
          pageTracker._trackPageview();
      } catch(err) {}</script>
      """

def googleanalyticsjs(parser, token):
  return ShowGoogleAnalyticsJS()

show_common_data = register.tag(googleanalyticsjs)

【讨论】:

    【解决方案5】:

    {% if debug %} 可以做到这一点,但前提是你通过RequestContext 而不是Context。此外,debug 不是布尔标志,它是一个函数,在评估时 DEBUG = True 返回一些调试信息。这对您的模板来说可能是不必要的开销。

    就我个人而言,我会使用这个技巧。

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

    这将始终有效,但它不依赖于 DEBUG 标志和 INTERNAL_IP,它只适用于硬编码的 IP。

    【讨论】:

    • 最好将其移动到带有takes_context=True 的模板标签,以免违反 DRY。
    【解决方案6】:

    您需要将DEBUG 标志添加到您的context_processors

    甚至可能没有替代方法。至少,我不知道。

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 2023-03-27
      • 2019-09-06
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多