web2py 格式化视图中的列表项

web2py Formatting list items in views

剧情简介:
我想看到这样的东西:

Regular Loan      Loan
Appliances Loan   Loan
Monthly Dues      Contribution
HELP              Contribution

...但我得到的是这个:

Regular Loan     <Set Loan>
Appliances Loan  <Set Loan>
Monthly Dues     <Set Contribution>
HELP             <Set Contribution>

如何将 <Set Loan><Set Contribution> 变成 LoanContribution

#controller
def get_service_name(type_id=int):
    type_item = db(db.service_types.id==type_id).select()
    return type_item[0].type_name

def list_services():
    rows = db(db.services).select()
    types = []
    for s in rows:
        types.append(db(get_service_name(s.service_type)))
    return locals()


#view
{{extend 'layout.html'}}
<h1>
    Services
</h1>
{{i = -1}}
{{for service in rows:}}
{{i = i +1}}
<tr><span>{{=service.service_name}}</span><span>{{=types[i]}}</span></tr><br>
{{pass}}

编辑 1

#db.py
db.define_table('service_types',
            Field('type_name', requires=[IS_NOT_EMPTY(), IS_SLUG()]),
            format='%(type_name)s',
)

db.define_table('services',
            Field('service_name',requires=[IS_NOT_EMPTY(),IS_NOT_IN_DB(db,'services.service_name')]),
            Field('service_type','reference service_types',requires=IS_IN_DB(db,db.service_types.id,
                                                                            '%(type_name)s',
                                                                            error_message='not in table',
                                                                            zero=None))
)

db(query) returns 一个 DAL Set 对象。我想相反,你想要:

types.append(get_service_name(s.service_type))

但事实上,它比这更简单,因为您可以使用 recursive selects 自动从 service_types table 中获取 DAL select(即,不需要 get_service_name 函数)。

def list_services():
    rows = db(db.services).select()
    return dict(rows=rows)

在视图中:

{{for service in rows:}}
<tr>
  <span>{{=service.service_name}}</span>
  <span>{{=service.service_type.type_name}}</span>
</tr><br>
{{pass}}

请注意,这种方法(以及您的原始代码)效率有点低,因为它会为每条记录创建一个额外的数据库 select。如果有很多记录,您可能想要进行连接:

def list_services():
    rows = db(db.services.service_type == db.service_types.id).select(
        db.services.service_name, db.service_types.type_name)
    return dict(rows=rows)

然后在视图中:

{{for row in rows:}}
<tr>
  <span>{{=row.services.service_name}}</span>
  <span>{{=row.service_types.type_name}}</span>
</tr><br>
{{pass}}

上述方法只需要一个查询。