我在模型中声明了一个表和虚拟字段,如下所示:(我也尝试了两个注释掉的声明,但它们不起作用)
scan_db.define_table('Shows',
Field('Name', unique=True),
Field('Logo', 'upload'),
Field('Delim', default='$'),
format= '%(Name)s')
#scan_db.Shows.src = Field.Virtual(lambda row : URL('download', args=row.Logo))
#scan_db.Shows.src = Field.Lazy(lambda row, alt=None : URL('download', args=row.Logo))
scan_db.Shows.src = Field.Lazy(lambda row, alt=None : URL('download', args=row.Logo if alt==None else alt))
在我的控制器中,我有以下功能,我修改了download():
,使其从scan_db
抓取(download()
与显示scan_db
的图像分开测试,它可以工作。)
def showlist():
shows = scan_db(scan_db.Shows).select()
return dict(shows=shows)
在我看来,我有:
{{for rec in shows:}}
{{=rec.src()}}
我得到错误:<type 'exceptions.AttributeError'> 'Row' object has no attribute 'Logo'
如果我将{{=rec.src()}}
更改为{{=rec}}
,则它会显示以下内容的列表:
<Row {'Name': 'PolarBear', 'Delim': '$', 'Logo': 'Shows.Logo.a1ef7016cfa89d1e.506f6c61722d437261702e706e67.png', 'id': 1L}>
看起来Shows.src
从未被添加到我的模型中???
视图中的代码并非用于显示实际图像。我把它拿出来试图缩小实际问题的范围。我原本打算在下面的一行中使用这个图像。
<Button type="button" src="{{=rec.src()}}" onclick='window.location="{{=URL('showscans', args=rec.id}}";'>
您必须在虚拟/懒惰字段定义中使用row.tablename.fieldname
语法。此外,最好在声明中包含名称:
scan_db.Shows.src = Field.Lazy('src',
lambda row, alt=None : URL('download', args=row.Shows.Logo if alt==None else alt))