web2py自定义用户配置文件?

11
“正确”的方法是如何扩展基本的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个回答

16

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

请注意,如果您只想向默认的 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来在注册和个人资料表单中隐藏它们。


1
谢谢,安东尼!你说得对,那里有一些官方文档,你的解决方案比我的好。一切看起来都很顺利。我注意到的一个额外的事情是,当我用username字段定义自定义表时,登录时使用的是用户名而不是email。这正是我想要的,而且书上说这是内置行为,这太好了!感谢你澄清所有这些。 - orlade
3
没问题。注意,如果您想更改身份验证表单中“用户名”字段的标签,可以通过auth.messages.label_username来指定标签(默认为“用户名”)。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接