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

8 投票
5 回答
26856 浏览
提问于 2025-04-15 22:21

在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'语句格式不正确

我在模板里想做的是建立一个简单的if/elif/else结构,以便能正确地表达

#foo_count == 0:
There are no foos.

#foo_count == 1:
There is one foo.

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

我查阅了Django模板的文档(这个链接GAE文档里提供的,看起来是针对比GAE支持的Django版本更新得多的版本),似乎我只能用布尔运算符(如果这个旧版本的Django确实支持布尔运算符)来处理字符串或其他模板变量。

难道在Django模板里不能把变量和整数或非字符串进行比较吗?

我相信有简单的方法可以解决这个问题,比如在Python端构建消息字符串,而不是在模板里做,但这看起来是个很简单的操作,应该可以在模板里处理。

听起来我应该换一个更高级的模板引擎,但因为我对Django(无论是模板还是其他部分)都很陌生,所以我想先确认一下。

5 个回答

2

在标签中,你也可以使用一些比较符号,比如 ==(等于),!=(不等于),<(小于),>(大于),<=(小于等于),>=(大于等于),还有 in(在……里面),not in(不在……里面),is(是),和 is not(不是),这些都是可以用的。

(Django 3.0)

{%if number > 1 %}

 #stuff 

{%elif number < 1 %}

 #stuff

{%elif number == 0 %}

 #stuff

{%endif%}

在模板中的比较,Django官方文档

6

正确的:

{% if foo_list == 1 %}

错误的:

{% if foo_list== 1 %}
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这个模板标签,因为布尔运算符只在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')

当然,你总是可以下载整个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(...))

然后在模板中:

{% 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 %}

撰写回答