昨天晚上试验Google App Engine (GAE),要在页面上显示一个时间的估计。我原本设计是在数据库中只存一个字段,即估计的分钟数,然后在页面上计算一下来显示,却被折腾了好几个小时,第一次试验有点失败,特记之。
我传到页面上的是一个对象数组,那么在页面上就得这么写:
{% for m in messages %}
<li> {{m.name}} – {{m.estimateMinutes}} 分钟 </li>
{% endfor %}
嗯,运行没有错误,很高兴。接下来我想大家还是比较习惯看小时:分钟的方式呈现,于是改了一下逻辑。
{% for m in messages %}
<li> {{m.name}} –
{% if m.estimateMinutes >= 60 %}
{{m.estimateMinutes/60}} 小时
{% endif %}
{% if m.estimateMinutes%60 >= 0 %}
{{m.estimateMinutes%60}} 分钟
{% endif %}
</li>
{% endfor %}
这下问题来了,死活在比较大小和除法这些地方报错。根据以前使用JSTL、Ruby的RHTML等模板的经验,似乎没有问题啊。看了JavaEye上hideto翻译的TheDjangoBook的第四章,也没找到关于这个问题的解释。后来换了几个关键字搜索也无果,于是到官方文档上仔细查看,终于在Philosophy里找到这么一句:
The Django template system provides tags which function similarly to some programming constructs – an if tag for boolean tests, a for tag for looping, etc. – but these are not simply executed as the corresponding Python code, and the template system will not execute arbitrary Python expressions.
原来模板是不支持数学运算的……枉费我这么时间。不过也算有收获,做东西之前还是不要急吼吼开工,基本的文档最好还是先溜一遍,特别是什么哲学之类的。
功能还是要完成啊,你让我在后台算完了贴上来?那岂不是太麻烦?还得在后台对所有的message做循环。我真的觉得这个哲学洁癖过分,显得有点蠢。后来在GAE Cookbook上看到可以把Jinja2 (另一个模板引擎) 整合到GAE中来,赶紧试验,不过发现似乎还不支持中文,渲染的时候会出错,还是过段时间吧。
好吧,算这个模板比较狠,我改数据库。添了一个estimateHours之后,世界清静了:
{% for m in messages %}
<li> {{m.name}} –
{% ifnotequal m.estimateHours 0 %}
{{m.estimateHours}} 小时
{% endifnotequal %}
{% ifnotequal m.estimateMinutes 0 %}
{{m.estimateMinutes}} 分钟
{% endifnotequal %}
</li>
{% endfor %}
但是,加上equal/notequal这些东东还不是引入了逻辑?我有点疑惑了。想一想模板的后果,是让我修改了模型层,难道模板的设计者还有让我们的模型层设计更加合理这种初衷?而且我也不知道这两种方法格外有多大的不同啊,囧。
好了,疑惑就疑惑到这里,还是要认真学习。而且模板也是在发展嘛,说不定GAE开发团队听到了开发者的心声就把这一点改掉了呢:)
hideto同学很勤奋,他翻译的The Django Book应该好好看看,尤其是:
第四章:Django模板系统
第十章:深入模板引擎