web2py Форматирование элементов списка в представлениях - PullRequest
0 голосов
/ 05 января 2019

Справка:
Я хочу увидеть что-то вроде этого:

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> просто Loan и Contribution?

#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 голосов
/ 05 января 2019

db(query) возвращает объект DAL Set. Я думаю, что вместо этого вы хотите:

types.append(get_service_name(s.service_type))

Но, на самом деле, это проще, чем, так как вы можете использовать рекурсивный выбор , чтобы DAL автоматически выбирал из таблицы service_types (т.е. нет необходимости в функции 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}}

Приведенный выше подход требует только одного запроса.

...