2

私はこれを達成する方法をウェブで検索し、複数の解決策を見つけました。それらのほとんどは厄介なコードを持っていました、それらのすべては欠点でした。いくつかのアイデアには、レコードに基づいてすべてのdbフィールドのデフォルト値を設定することが含まれていました。他のものは、複数のSQLFORMを追加することによって機能し、その結果、ページのインデントに違いが生じました(1つのフォームに2つのHTMLテーブルがあるため)。

2つのテーブルの結合に基づいて、レコードの読み取り専用表現を提供するコンパクトでエレガントな方法を探しています。確かに、これを達成するための簡単な方法があるはずですよね?Web2pyブックには、挿入フォームの例のみが含まれています。それは私が探しているこの種のきちんとした解決策です。

将来的には、更新機能も提供するマルチテーブルフォームが必要になる可能性がありますが、今のところ、レコード用の単純な読み取り専用フォームを入手できれば幸いです。

何か提案をいただければ幸いです。

4

1 に答える 1

2

これは私にとってはうまくいくようです:

def test():
  fields = [db.tableA[field] for field in db.tableA.keys() \
      if type(db.tableA[field]) == type(db.tableA.some_field)]
  fields += [db.tableB[field] for field in db.tableB.keys() \
      if type(db.tableB[field]) == type(db.tableB.some_field)]


  ff = []
  for field in fields:
     ff.append(Field(field.name, field.type))

  form = SQLFORM.factory(*ff, readonly=True)

  return dict(form=form)

field.required、field.requires validtaorsなどを追加できます。また、SQLFORM.factoryを使用しているため、それを検証して更新/挿入できるはずです。Fieldこのメソッドを使用して作成しているフォームに、更新用のフォームを検証するために必要なすべての情報が含まれていることを確認してください。上記のインスタンス化に簡単に追加できると思います。

編集:そうそう、レコードIDに基づいてフォームを事前入力するには(フォームが定義された後)、問題のレコードの値を取得する必要があります...また..リスト内包表記の代わりに、 SQLFORM.factoryを使用して、次の2つのテーブルを提供できます。

def test():
  form = SQLFORM.factory(db.tableA, db.tableB, readonly=True)

  record = ... (query for your record, probably based on an id in request.args(0))
  for field in record.keys():
    if (*test if this really is a field*):
      form.vars[field] = record[field]

  return dict(form=form)

事前入力用の疑似コードのみを提供したため、多少の調整が必要になります...ただし、 http://web2py.com/books/default/chapter/29/7#Pre-populating-the-formとSQLFORM/SQLFORM.factoryセクション。

于 2012-07-11T17:09:35.583 に答える