Web2py中如何将id转换为引用字段?
How to convert id into referenced field in Web2py?
考虑下面的 3 table(A
、B
和 C
),其中 table C
有 2 个字段引用table A
和 B
。
型号:
db.define_table('A',
Field('A1', 'string', required =True),
Field('A2', 'string', required =True),
Field('A3', 'string', required =True),
format=lambda r: '%s, %s' % (r.A.A1, r.A.A2))
db.define_table('B',
Field('B1', 'string', required=True),
Field('B2', 'string', required=True),
Field('B3', 'string', required=True),
format=lambda r: '%s, %s' % (r.B.B1, r.B.B2))
db.define_table('C',
Field('C1', db.A),
Field('C2', db.B),
Field('C3', 'string', required=True),
format=lambda r: '%s, %s - %s' % (r.C.C1, r.C.C2))
控制器:
def C_view():
if request.args(0) is None:
rows = db(db.C).select(orderby=db.C.C1|db.C.C2)
else:
letter = request.args(0)
rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2)
return locals()
在下面的相应视图中,我显示了 table C:
的 3 个字段
...
{{ for x in rows:}}
<tr>
<td>{{=x.C1}}</td>
<td>{{=x.C2}}</td>
<td>{{=x.C3}}</td>
</tr>
{{pass}}
...
使用此设置,视图显示 C1 和 C2 的外部 ID。我将如何修改模型、控制器 and/or 视图以显示相应的引用字段而不是 ID?换一种说法:
对于 C1
,视图应显示 r.A.A1, r.A.A2
,对于 C2
,视图应显示 r.B.B1, r.B.B2
.
谢谢。
据我所知,用于定义引用字段的 web2py 语法如下:
Field('C1', 'reference A'),
Field('C2', 'reference B'),
那么,在您看来,x.C1
将是 A
table 中的一个 Row
对象,因此:
<td>{{=x.C1.A1}}, {{=x.C1.A2}}, {{=x.C1.A3}}</td>
<td>{{=x.C2.B1}}, {{=x.C2.B2}}, {{=x.C2.B3}}</td>
希望对您有所帮助!
您需要正确使用format: Record representation
并使用render()
将ids转换成各自的表示形式。
您的模型将如下所示:
db.define_table('A',
Field('A1', 'string', required=True),
Field('A2', 'string', required=True),
Field('A3', 'string', required=True),
format='%(A1)s, %(A2)s')
db.define_table('B',
Field('B1', 'string', required=True),
Field('B2', 'string', required=True),
Field('B3', 'string', required=True),
format='%(B1)s, %(B2)s')
db.define_table('C',
Field('C1', db.A),
Field('C2', db.B),
Field('C3', 'string', required=True))
并更新控制器并使用 render()。
render() returns 一个遍历所有行的生成器。
def C_view():
if request.args(0) is None:
rows = db(db.C).select(orderby=db.C.C1|db.C.C2).render()
else:
letter = request.args(0)
rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2).render()
return locals()
参考:
考虑下面的 3 table(A
、B
和 C
),其中 table C
有 2 个字段引用table A
和 B
。
型号:
db.define_table('A',
Field('A1', 'string', required =True),
Field('A2', 'string', required =True),
Field('A3', 'string', required =True),
format=lambda r: '%s, %s' % (r.A.A1, r.A.A2))
db.define_table('B',
Field('B1', 'string', required=True),
Field('B2', 'string', required=True),
Field('B3', 'string', required=True),
format=lambda r: '%s, %s' % (r.B.B1, r.B.B2))
db.define_table('C',
Field('C1', db.A),
Field('C2', db.B),
Field('C3', 'string', required=True),
format=lambda r: '%s, %s - %s' % (r.C.C1, r.C.C2))
控制器:
def C_view():
if request.args(0) is None:
rows = db(db.C).select(orderby=db.C.C1|db.C.C2)
else:
letter = request.args(0)
rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2)
return locals()
在下面的相应视图中,我显示了 table C:
的 3 个字段...
{{ for x in rows:}}
<tr>
<td>{{=x.C1}}</td>
<td>{{=x.C2}}</td>
<td>{{=x.C3}}</td>
</tr>
{{pass}}
...
使用此设置,视图显示 C1 和 C2 的外部 ID。我将如何修改模型、控制器 and/or 视图以显示相应的引用字段而不是 ID?换一种说法:
对于 C1
,视图应显示 r.A.A1, r.A.A2
,对于 C2
,视图应显示 r.B.B1, r.B.B2
.
谢谢。
据我所知,用于定义引用字段的 web2py 语法如下:
Field('C1', 'reference A'),
Field('C2', 'reference B'),
那么,在您看来,x.C1
将是 A
table 中的一个 Row
对象,因此:
<td>{{=x.C1.A1}}, {{=x.C1.A2}}, {{=x.C1.A3}}</td>
<td>{{=x.C2.B1}}, {{=x.C2.B2}}, {{=x.C2.B3}}</td>
希望对您有所帮助!
您需要正确使用format: Record representation
并使用render()
将ids转换成各自的表示形式。
您的模型将如下所示:
db.define_table('A',
Field('A1', 'string', required=True),
Field('A2', 'string', required=True),
Field('A3', 'string', required=True),
format='%(A1)s, %(A2)s')
db.define_table('B',
Field('B1', 'string', required=True),
Field('B2', 'string', required=True),
Field('B3', 'string', required=True),
format='%(B1)s, %(B2)s')
db.define_table('C',
Field('C1', db.A),
Field('C2', db.B),
Field('C3', 'string', required=True))
并更新控制器并使用 render()。 render() returns 一个遍历所有行的生成器。
def C_view():
if request.args(0) is None:
rows = db(db.C).select(orderby=db.C.C1|db.C.C2).render()
else:
letter = request.args(0)
rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2).render()
return locals()
参考: