web2py格式化视图中的列表项

时间:2019-01-05 07:13:44

标签: python web2py

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

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))
)

1 个答案:

答案 0 :(得分:0)

db(query)返回一个DAL Set对象。我想相反,您想要:

types.append(get_service_name(s.service_type))

但是,实际上,这比这更简单,因为您可以使用recursive selectsservice_types表中自动选择DAL(即不需要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}}

请注意,这种方法(以及您的原始代码)效率不高,因为它会为每个记录选择一个额外的数据库。如果记录很多,您可能要加入一个连接:

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}}

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