首页 文章

无法弄清楚Web2py Ticket错误

提问于
浏览
0

我是Web2py的新手,无法理解故障单丢失的错误 . 有人可以解释错误及其发生的原因吗?

这是门票:

机票ID

127.0.0.1.2012-08-29.01-43-16.edfb1953-fd71-4aa6-a768-815fe46fe273'表达式'对象没有属性'strip'

追溯

Traceback (most recent call last):
      File "/home/user/Web2py/web2py/gluon/restricted.py", line 205, in restricted exec ccode in environment
      File "/home/user/Web2py/web2py/applications/SocialImage/models/db.py", line 12, in  format = '%(title)s')
      File "/home/user/Web2py/web2py/gluon/dal.py", line 6320, in define_table
    polymodel=polymodel)
      File "/home/user/Web2py/web2py/gluon/dal.py", line 598, in create_table referenced = field.type[10:].strip()
   AttributeError: 'Expression' object has no attribute 'strip'
Error snapshot

('Expression' object has no attribute 'strip')
Function argument list

(self=, table=, 'id': }>, migrate=True, fake_migrate=False, polymodel=None)
Code listing

            sortable += 1
            k = field.name
            if isinstance(field.type,SQLCustomType):
                ftype = field.type.native or field.type.type
            elif field.type.startswith('reference'):
                referenced = field.type[10:].strip()

                constraint_name = self.constraint_name(tablename, field.name)
                if hasattr(table,'_primarykey'):
                    rtablename,rfieldname = referenced.split('.')
                    rtable = table._db[rtablename]

码:

db = DAL("sqlite://storage.sqlite")

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

    db.define_table('image',
        Field('title', unique=True),
        Field('file', 'upload'),
        Field('uploader_name', db.user.uname),
        format = '%(title)s')

    db.define_table('comment',
        Field('image_id', db.image),
        Field('authors', db.user.uname),
        Field('body', 'text'))

    db.user.email.requires=IS_EMAIL()
    db.user.uname.requires=IS_NOT_IN_DB(db,db.uname)
    db.user.name=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,'%(title)s')
    db.comment.image_id.writable=db.comment.image_id.readable=False

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 ,这会立即强制定义用户表 .

    最后,为引用的表添加“format”属性是个好主意 - 默认情况下,引用字段使用引用表的“format”属性来确定如何在表单下拉列表中显示字段的值,网格/表格和只读表格 . 对于用户表,您可以执行以下操作:

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

    在这种情况下,引用用户表的所有字段都将显示uname值而不是底层记录id(即使引用字段本身将存储记录id) .

相关问题