我正在写一瓶SimpleTemplate,我想比较一个日期。如何(以及在何处)在模板中导入python包?可能吗?
以下是我正在尝试做的一个例子。我想将表示日期的数据(字符串)与今天的日期进行比较:
%if datetime.strptime(report['date'], '%m/%d/%Y') < datetime.today():
<span class="ui-icon ui-icon-circle-close"></span>
%elif report['result']:
<span class="ui-icon ui-icon-circle-check"></span>
%elif not report['result']:
<span class="ui-icon ui-icon-alert"></span>
%end
为了在普通的python程序中完成这项工作,我不得不说
from datetime import datetime
但是有没有办法在模板中做到这一点?
答案 0 :(得分:2)
是的,从内部模板导入模块是可能的。例如,这由bottlepy本身用于生成错误页面:
ERROR_PAGE_TEMPLATE = """
%%try:
%%from %s import DEBUG, HTTP_CODES, request, touni
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>Error: {{e.status}}</title>
...
答案 1 :(得分:0)
不,这是不可能的。模板并不意味着包含复杂的逻辑,它们是表示层的一部分。您应该在视图中准备好所有数据并将其传递给已经处理过的模板。
因此,在您的情况下,您可能应该将您的逻辑移动到视图中 - 从而产生以下内容:
from datetime import datetime
if datetime.strptime(report['date'], '%m/%d/%Y') > datetime.today():
report["status"] = "due"
else:
if report["result"]:
report["status"] = "pending_check"
else:
report["status"] = "missing_result"
然后在模板中检查标志,如下所示:
%if report["status"] == "due":
<span class="ui-icon ui-icon-circle-close"></span>
%elif report["status"] == "pending_check":
<span class="ui-icon ui-icon-circle-check"></span>
%elif report["status"] == "missing_result":
<span class="ui-icon ui-icon-alert"></span>
%end
我没有故意使用close
,check
和alert
作为report["status"]
值,因为最佳做法是将数据与表示分离,因此不会分配HTML类视图中的名称,而是像我在附加的代码段中那样对模板中处理的数据进行操作。
然后,如果您决定更改图标,则只能在模板中执行此操作,该模板优于在视图中执行表示更改(例如,必须重新启动Web服务器才能使其生效)。
更新(2016年4月): 显然现在可能或者有可能,因为我回答,在Bottle模板中导入模块,但这仍然是一个坏主意:)
答案 2 :(得分:0)
我刚试过:
%from mymodule import *
它似乎工作,没有时间进一步检查,我认为导入只是调用python方法,因此应该工作。