web2py 实时特定 table

web2py real time specific table

例如在控制器中我有以下查询:

a= db().select(db.my_db.ALL)

如何在视图中添加一个按钮,以便实时仅显示字段 a.date 大于用户所选日期的行。我看到我可以使用 ajax 实时刷新 table,但我不知道如何添加带日期的按钮。

有人知道吗?

使用web2py's Ajax很简单:

在您的模型中:

import datetime
import arrow # nifty library to parse dates, http://arrow.readthedocs.org/en/latest/

mem = DAL('sqlite:memory')
mem.define_table('some_data',Field('effdt','date',default=request.now), Field('foo',default='bar'))
for x in range(100):
    when = request.now - datetime.timedelta(x)
    what = arrow.get(when).humanize()
    mem.some_data.insert(foo=what,effdt=when)

这将填充临时 table 一些数据以供查看。

在你的控制器中:

def index():
    form = FORM(
        INPUT(_type='date', _name='since'),
        BUTTON('click me',_onclick="ajax('{}',['since'],'show_table');".format(URL(f='recent_table')))
    )
    return dict(form=form, prefill=recent_table())

上面创建了一个带有 html5 日期输入和按钮的表单。当按下按钮时,来自 web2py 库的 ajax 函数将 post 表单输入 ['since'] 到函数 recent_table 并将结果放入 DOM 元素ID show_table。 return 语句提供表单并执行 recent_table 一次,因此您在第一次加载时就已经有了数据。

def recent_table():
    if request.vars.since:
        since = arrow.get(request.vars.since).datetime
    else:
        since=request.now-datetime.timedelta(5)
    return mem(mem.some_data.effdt >= since).select()

上面读取了 post 由 ajax 调用编辑的 since 参数,如果找不到 since,则默认为今天减去 5 天。然后它会找到 table 中与您的请求匹配的所有行。

在您看来:

{{extend 'layout.html'}}

{{=form}}

<div id="show_table">
    {{=prefill}}
</div>

在包含结果 form 的视图中,定义 ajax 函数应丢弃其结果的区域(在 ajax 调用中定义 show_table )和填写已计算的 prefill 以便用户在第一页加载时有数据。