0

私は Web2py を初めて使用し、チケットがスローしているエラーを理解できません。誰かがエラーとその理由を説明できますか?

これがチケットです:

チケットID

127.0.0.1.2012-08-29.01-43-16.edfb1953-fd71-4aa6-a768-815fe46fe273「式」オブジェクトには属性「ストリップ」がありません

トレースバック

   トレースバック (最新の呼び出しが最後):
      ファイル「/home/user/Web2py/web2py/gluon/restricted.py」、205行目、環境内の制限されたexec ccode
      ファイル "/home/user/Web2py/web2py/applications/SocialImage/models/db.py"、12 行目、フォーマット = '%(title)s')
      ファイル "/home/user/Web2py/web2py/gluon/dal.py"、6320 行目、define_table 内
    ポリモデル=ポリモデル)
      ファイル "/home/user/Web2py/web2py/gluon/dal.py"、598 行目、create_table 参照 = field.type[10:].strip()
   AttributeError: 'Expression' オブジェクトに属性 'strip' がありません
エラーのスナップショット

(「式」オブジェクトには属性「ストリップ」がありません)

関数の引数リスト

(self=, table=, 'id': }>, migrate=True, fake_migrate=False, polymodel=None)
コード一覧

            ソート可能 += 1
            k = フィールド名
            インスタンスの場合 (field.type,SQLCustomType):
                ftype = field.type.native または field.type.type
            elif field.type.startswith('参照'):
                参照 = フィールド.タイプ[10:].ストリップ()

                constraint_name = self.constraint_name(テーブル名、フィールド名)
                hasattr (テーブル、'_primarykey') の場合:
                    rtablename,rfieldname = referenced.split('.')
                    rtable = table._db[rtablename]

コード:

    デシベル = DAL("sqlite://storage.sqlite")

    db.define_table('ユーザー',
        Field('uname',unique=True),
        フィールド名')、
        フィールド('メール'))

    db.define_table('画像',
        Field('タイトル', unique=True),
        Field('ファイル', 'アップロード'),
        Field('uploader_name', db.user.uname),
        format = '%(タイトル)s')

    db.define_table('コメント',
        Field('image_id', db.image),
        Field('authors', db.user.uname),
        Field('本文', 'テキスト'))

    デシベル.user.email.requires=IS_EMAIL()
    db.user.uname.requires=IS_NOT_IN_DB(db,db.uname)
    デシベル.ユーザー名=IS_NOT_EMPTY()
    db.image.uploader.requires=IS_IN_DB(db,db.user.uname)
    db.comment.image_id.requires=IS_IN_DB(db,db.image.id,'%(タイトル)s')
    デシベル.comment.image_id.writable=デシベル.comment.image_id.readable=False
4

1 に答える 1

1

参照フィールドを正しく定義していません。テーブル内の特定のフィールドではなく、テーブルを参照する必要があります。たとえば、次のようなものがあります。

Field('uploader_name', db.user.uname)

次のようになります。

Field('uploader_name', db.user)

参照フィールドは、ユーザー テーブルからの実際の uname を保存しないことに注意してください。ユーザー テーブルから参照されるレコードの ID を保存します。その参照から、必要に応じて uname を取得できます。

また、web2py の次の 2.0 リリースには、テーブルを遅延して定義する新しい「遅延テーブル」機能が含まれています (完全な定義は、テーブルが db.tablename 参照を介して最初にアクセスされるまで延期されます)。したがって、テーブルを怠惰に保つには、参照フィールドを定義するための推奨される方法は次のようになります。

Field('uploader_name', 'reference user')

db.userこれにより、すぐにユーザー テーブルの定義が強制される の使用が回避されます。

最後に、参照されるテーブルに「フォーマット」属性を追加することをお勧めします。デフォルトでは、参照フィールドは参照されるテーブルの「フォーマット」属性を使用して、フィールドの値をフォーム ドロップダウンに表示する方法を決定します。グリッド/テーブル、および読み取り専用フォーム。ユーザーテーブルの場合、次のことができます。

db.define_table('user',
    Field('uname',unique=True),
    Field('name'),
    Field('email'),
    format='%(uname)s')

その場合、ユーザー テーブルを参照するすべてのフィールドは、基礎となるレコード ID の代わりに uname 値を表示します (参照フィールド自体がレコード ID を格納する場合でも)。

于 2012-08-28T21:20:53.550 に答える