【问题标题】:Can I compare a template variable to an integer in Django/App Engine templates?我可以将模板变量与 Django/App Engine 模板中的整数进行比较吗?
【发布时间】:2011-02-15 17:43:51
【问题描述】:

在 Google App Engine 中使用 Django 模板(在 Python 上),是否可以将模板变量与 {% if %} 块中的整数进行比较?

views.py:

class MyHandler(webapp.RequestHandler):
    def get(self):
        foo_list = db.GqlQuery(...)
        ...
        template_values['foos'] = foo_list
        template_values['foo_count'] = len(foo_list)
        handler.response.out.write(template.render(...))

我的模板:

{% if foo_count == 1 %}
     There is one foo.
{% endif %}

'if' statement improperly formatted 爆了。

我试图在我的模板中做的是构建一个简单的 if/elif/else 树,以便在语法上正确以便能够声明

#foo_count == 0:
There are no foos.

#foo_count == 1:
There is one foo.

#else:
There are {{ foos|length }} foos.

浏览 Django 模板文档(this link 提供的in the GAE documentation 似乎适用于比 GAE 支持的版本更新得多的 Django 版本),似乎我只能实际使用布尔运算符(如果实际上是布尔运算符在这个旧版本的 Django 中支持)带有字符串或其他模板变量。

难道不能用 Django 模板将变量与整数或非字符串进行比较吗?

我确信有一种简单的方法可以解决这个问题 - 在 Python 端而不是在模板中构建消息字符串 - 但这似乎是一个您应该能够在模板中处理的简单操作。

听起来我应该切换到更高级的模板引擎,但由于我是 Django 的新手(模板或它的任何部分),我只想先确认一下。

【问题讨论】:

  • webapp模板系统来自Django 0.96;文档位于djangoproject.com/documentation/0.96 App Engine 上提供了较新版本的 Django,但在使用 webapp 而不是整个 django 框架时加载它们可能会很棘手。

标签: python google-app-engine django-templates


【解决方案1】:

if 标记还可以使用运算符 ==、!=、、=、in、not in、is 和 not,哪个有效。

(Django 3.0)

{%if number > 1 %}

 #stuff 

{%elif number < 1 %}

 #stuff

{%elif number == 0 %}

 #stuff

{%endif%}

Comparison in Templates Django Official Doc

【讨论】:

    【解决方案2】:

    右:

    {% if foo_list == 1 %}
    

    错误:

    {% if foo_list== 1 %}
    

    【讨论】:

      【解决方案3】:

      您很可能正在使用 Django 0.96:

      App Engine Python 环境 包括三个版本的 Django: 0.96、1.0.2 和 1.1。 Django 0.96 包含在 App Engine SDK 中,并且 是被导入的版本 应用程序导入 django 时的默认值 包。

      来源:http://code.google.com/appengine/docs/python/tools/libraries.html#Django

      正如 xyld 所说,您必须使用 ifequal 模板标签,因为 boolean operators 仅包含在 1.2 版中,目前处于测试阶段。

      documentation for version 0.96 can be found here或者你也可以使用1.1版:

      import os
      os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
      
      from google.appengine.dist import use_library
      use_library('django', '1.1')
      

      当然,您始终可以下载整个 Django 项目,并将其包含在应用程序的顶级目录中。可以在this article 中找到有关如何做到这一点的一些提示。

      编辑:由于ifequal 不适合整数,您可以将其他变量传递给您的模板。

      class MyHandler(webapp.RequestHandler):
          def get(self):
              foo_list = db.GqlQuery(...)
              ...
              template_values['foos'] = foo_list
              template_values['foo_count'] = len(foo_list)
              template_values['one_foo'] = len(foo_list) == 1
              handler.response.out.write(template.render(...))
      

      在模板中:

      {% if one_foo %}
          You have one foo.
      {% endif %}
      

      或:

      {% if foo_list %}
          You have {{ foo_count }} foo{{foo_count|pluralize}}.
      {% else %}
          You have no foos
      {% endif %}
      

      【讨论】:

      • 来自 ifequal 的文档:“只能将参数与模板变量或字符串进行比较。”。因此,它听起来不适合用于与整数的比较(测试列表的长度)
      【解决方案4】:

      Django 1.2 允许在 {% if %} 标记中使用 == 运算符。如果你需要比较两个整数或其他项目,你总是可以在旧版本的 Django 中使用{% ifequal a b %}...{% endifequal %}

      我的猜测是您正在阅读开发文档 (django 1.2),但使用的是 django 1.1 或 1.1.1

      但是,如果您需要执行 {{ foo|length }} 并比较该模板标签 + 过滤器的输出,您将无法做到。您需要修复视图逻辑来为您计算它,以便您可以在模板中使用它。

      另外,根据您使用列表的方式,您可以查看for...empty

      http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for-empty

      【讨论】:

      • 这种类型的逻辑在任何类型的 Python 模板引擎中都会被认为“太复杂”,而不仅仅是?因为这对我来说似乎很简单——我并不是在尝试执行实际代码,只是一些 if 语句。
      • 如果你只是比较两个整数,它并不复杂,但较旧的 Django(1.2 之前,尚未正式发布)需要使用 {% ifequal %},尝试使用 ifequal 看看是否可行{% if 1 == 1 %}
      • 当前的开发版本文档声明“只能将参数与模板变量或字符串进行比较。”
      • 如何定义“太复杂”取决于您使用模板语言的目的。在其他模板语言中,这种逻辑是小菜一碟——它们比 Django 模板给你更多的表现力。无论如何,如果您决定使用另一个模板引擎,如果您对 Python 感到满意,请考虑 Mako
      • 没错,“太复杂”是非常主观的。不让你做“太复杂”的事情背后的想法是避免模板中的逻辑过多。它不仅是一个错误的地方,而且模板的最初目的是为那些可能有也可能没有编程经验的网页设计师准备的。因此,模板中过多的“复杂性”可能会使他们感到困惑......
      【解决方案5】:

      您正在使用一个名为 foo_list 的模板变量:

      {% if foo_list == 1 %}
      

      但您的代码构建的模板中没有这样的变量,只有foofoo_count

      【讨论】:

      • AFAIK,未定义的模板变量可以,只是被忽略。正确的?至少,它不是syntax error...
      • 抱歉,这是因为我试图获取真实代码并将其简化而造成的拼写错误 - 让我来解决这个问题。
      猜你喜欢
      • 2020-02-08
      • 2017-05-20
      • 1970-01-01
      • 2015-05-05
      • 2014-08-25
      • 2013-04-06
      • 2011-02-12
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多