web2py自定义用户个人资料?

时间:2011-08-19 11:53:48

标签: web2py profile

  

扩展基础auth_user表/的“正确”方法是什么?   整个auth系统,以支持一些自定义用户   个人资料字段(例如用户名,地点,生日等)?

我从谷歌搜索中看到了一些方法,但似乎没有人给出一个直接的答案。答案似乎是要么用自定义表替换基auth_user表(并让auth系统知道),要么创建一个带有外键引用的新扩展表,返回基本auth_user表。第一个似乎有可重用性问题,第二个似乎有形式等问题。

有没有人有任何指针可以修补一些像自定义用户配置文件一样普遍的内容而不会破坏太多?

编辑:更多的阅读建议覆盖基础auth_user表是要走的路,经过一些试验和错误,我发现它就像放入一个简单的代码块:

# before define_tables()
auth.settings.table_user = db.define_table('auth_user',
    Field('email', length=128,label=T('Email'), default='', unique=True),
    Field('user_name', length=128, label=T('User name'), default='', unique=True, 
        requires=IS_NOT_IN_DB(db, 'auth_user.user_name')
    ),
    Field('password', 'password', readable=False, label=T('Password'),
        requires=CRYPT()
    ),
    Field('first_name', length=128, label=T('First name'), default='',
        requires=(IS_NOT_EMPTY(error_message=auth.messages.is_empty),
        IS_NOT_IN_DB(db, 'auth_user.first_name'))
    ),
    Field('last_name', length=128, label=T('Last name'), default='',
        requires=(IS_NOT_EMPTY(error_message=auth.messages.is_empty),
        IS_NOT_IN_DB(db, 'auth_user.last_name'))
    ),
    Field('registration_key', length=128, default='', writable=False, readable=False),
    Field('country', 'string', length=15, label=T('Country'),
        requires=IS_NULL_OR(IS_IN_SET(('England')))
    ),
)

只要在models / db.py中的auth = Auth(db)之后和auth.define_tables()之后执行,这一切似乎都没问题。这些字段显示在用户个人资料页面上,其他所有内容仍然按预期工作。

不确定如何回答我自己的问题,所以在此期间,如果有人可以解释为什么这是正确的方法来做到这一点,还有什么必须记住,我会欣赏它!

1 个答案:

答案 0 :(得分:16)

auth.settings.table_user_name存储用户表的名称(默认为auth_user),auth.settings.table_user是对用户表本身的引用。这两个设置在Auth代码的其他地方使用,因此在创建自定义用户表时更新它们很重要(在您的情况下,您不需要更新auth.settings.table_user_name,因为您保留了默认名称)。书中有一节展示了customizing Auth tables的这种方法。

注意,如果您只想在默认的auth_user表中添加一些额外的字段,而不是像您一样重新定义整个表,您可以这样做:

auth.settings.extra_fields[auth.settings.table_user_name] = [Field('myfield1',...),
    Field('myfield2',...), etc.]

在调用auth.define_tables()之前,这些额外字段将附加到auth_user表。请注意,如果默认auth_user表格中有一些您根本不想使用的字段,则可以通过设置readablewritable属性将其隐藏在注册表和个人资料表单中到False