3

我正在写一个瓶子 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

但是有没有办法在模板中做到这一点?

4

3 回答 3

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>
...
于 2016-01-03T16:54:02.240 回答
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,checkalert作为report["status"]值,因为最佳实践是将数据与表示分离,因此不在视图中分配 HTML 类名称,而是像我在附加的代码段中那样对模板中的已处理数据进行操作。

然后,如果您决定更改图标,您只需在模板中执行此操作,这优于在视图中进行演示更改(例如,必须重新启动 Web 服务器才能使它们生效)。

更新(2016 年 4 月): 显然现在有可能或变得有可能,因为我回答了,在瓶子模板中导入模块,但这仍然是一个坏主意 :)

于 2013-03-14T19:15:55.360 回答
0

我刚试过:

%from mymodule import *

它似乎工作,没有时间进一步检查,我认为导入只是调用一个python方法,因此应该工作。

于 2013-05-25T10:57:28.663 回答