首页 文章

Web2py:使用Field表示没有SQLFORM

提问于
浏览
1

在Web2py中,您可以将lambda分配给数据库Field以将其表示为文本: Field('duetime', 'time', represent=lambda t,r: t.strftime("%H:%M") if t else '') 在生成SQLForm时使用此类描述,您将获得良好的时间表示(不会显示秒数) .

但是当我想在纯HTML视图中使用数据表示时,我只获得原始数据: for r in rows: print "Repr: %s Str: %s" % (r.duetime.repr(),r.duetime.str()) Repr: datetime.time(16, 15) Str: 16:15:00 Repr: None Str: None 所以看起来只有SQLForm在内部生成字段表示 . 如何获取包含数据表示而不是原始数据的查询结果集(行)?

2 回答

  • 0

    您可以使用 Rows.render 方法 . 对于单个记录:

    rows = db(query).select()
    rendered_row = rows.render(0) # apply "represent" functions to the first row
    print rendered_row.duetime
    

    为了提高效率,您可以限制“代表”函数将应用于哪些字段:

    rendered_row = rows.render(0, fields=[db.mytable.duetime])
    

    如果没有将索引作为 .render() 的第一个参数传递,它将返回一个生成器,允许您遍历所有行:

    for row in rows.render():
        print row.duetime
    

    如果要循环遍历行的子集,请创建子集并在子集上调用 .render()

    for row in rows[0:10].render():
        print row.duetime
    

    book中的详细信息 .

  • 2

    好吧,我写了一个小函数,它将Rows和Table作为参数并返回字典列表,其中键是字段,值是它们的表示(几乎像行): def get_rows_representation(rows,table): return [{f: table[f].represent(r[f],r) if table[f].represent else r[f] for f in r.as_dict()} for r in rows]

    但也许有更好的本地方式来直接从Rows获取Field表示?

相关问题