代码之家  ›  专栏  ›  技术社区  ›  matt b

我可以比较django/app引擎模板中的模板变量和整数吗?

  •  5
  • matt b  · 技术社区  · 14 年前

    在google app engine中使用django模板(在python上),可以将模板变量与 {% if %} 街区?

    查看:

    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 似乎django的版本比gae支持的版本要新得多,似乎我只能实际使用带有字符串或其他模板变量的布尔运算符(如果在django的旧版本中实际上支持布尔运算符)。

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

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

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

    4 回复  |  直到 7 年前
        1
  •  4
  •   jbochi    14 年前

    您最可能使用的是django 0.96:

    应用程序引擎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

    正如xyd所说,您必须使用 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 .

    编辑 因为自从 如果相等 不适合整数,可以将其他变量传递到模板。

    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 %}
    
        2
  •  2
  •   Stephen Rauch Eugen    7 年前

    正确的:

    {% if foo_list == 1 %}
    

    错误的:

    {% if foo_list== 1 %}
    
        3
  •  1
  •   Alex Martelli    14 年前

    您正在使用名为 foo_list :

    {% if foo_list == 1 %}
    

    但是在你的代码构建的模板中没有这样的变量 foo foo_count .

        4
  •  1
  •   dlamotte    14 年前

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

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

    但是,如果你需要的话 {{ foo|length }} 然后比较模板tag+filter的输出,您将无法。您需要修改视图逻辑来计算它,以便在模板中使用它。

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

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