我可以将模板变量与Django/App Engine模板中的整数进行比较吗?

mat*_*t b 5 python google-app-engine django-templates

在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(...))
Run Code Online (Sandbox Code Playgroud)

我的模板:

{% if foo_count == 1 %}
     There is one foo.
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这爆发了'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.
Run Code Online (Sandbox Code Playgroud)

浏览Django模板文档(GAE文档中提供的这个链接似乎是比GAE支持的更新版本的Django),看起来好像我只能实际使用布尔运算符(如果实际上支持布尔运算符)这个旧版本的Django)带有字符串或其他模板变量.

是不是可以将变量与Django模板的整数或非字符串进行比较?

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

听起来我应该转向更高级的模板引擎,但由于我是Django的新手(模板或其中的任何部分),我首先想要一些确认.

小智 6

正确的:

{% if foo_list == 1 %}
Run Code Online (Sandbox Code Playgroud)

错误的:

{% if foo_list== 1 %}
Run Code Online (Sandbox Code Playgroud)


jbo*_*chi 4

您很可能正在使用 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 所说,您必须使用ifequaltemplatetag,因为布尔运算符仅包含在版本 1.2 中,该版本目前处于测试阶段。

0.96 版本的文档可以在这里找到,或者您也可以使用 1.1 版本:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

from google.appengine.dist import use_library
use_library('django', '1.1')
Run Code Online (Sandbox Code Playgroud)

当然,您始终可以下载整个 Django 项目,并将其包含在应用程序的顶级目录中。有关如何执行此操作的一些提示可以在本文中找到。

编辑:由于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(...))
Run Code Online (Sandbox Code Playgroud)

并在模板中:

{% if one_foo %}
    You have one foo.
{% endif %}
Run Code Online (Sandbox Code Playgroud)

或者:

{% if foo_list %}
    You have {{ foo_count }} foo{{foo_count|pluralize}}.
{% else %}
    You have no foos
{% endif %}
Run Code Online (Sandbox Code Playgroud)