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

时间:2010-05-05 01:38:46

标签: 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(...))

我的模板:

{% 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的新手(模板或其任何部分),我首先想要一些确认。

5 个答案:

答案 0 :(得分: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所说,您必须使用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 %}

答案 1 :(得分:2)

右:

{% if foo_list == 1 %}

错误:

{% if foo_list== 1 %}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

{% if foo_list == 1 %}

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

答案 4 :(得分:0)

如果标记也可以使用运算符==,!=,<,>,<=,> =,则in,not in,is和is不起作用。

(Django 3.0)

{%if number > 1 %}

 #stuff 

{%elif number < 1 %}

 #stuff

{%elif number == 0 %}

 #stuff

{%endif%}

Comparison in Templates Django Official Doc