问题 web2py自定义用户个人资料?


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

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

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

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

# 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')))
    ),
)

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

不知道如何回答我自己的问题,所以在此期间,如果有人可以解释 为什么 这是正确的方法,还有什么必须记住,我很感激!


11829
2017-08-19 11:53


起源



答案:


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

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

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

在打电话之前 auth.define_tables(),这些额外的字段将附加到 auth_user 表。注意,如果默认情况下有一些字段 auth_user 您根本不想使用的表,您可以通过设置它们来隐藏它们在注册和配置文件表单中 readable 和 writable 属性到 False


16
2017-08-19 14:38



谢谢,安东尼!你是对的,那里有一些官方文件,你的解决方案比我的好。这一切似乎很合适。我注意到的另一件事是当我使用a定义我的自定义表时 username 字段,用户名用于登录而不是 email。这就是我想要的,这本书说它是内置的行为,这是特别好的!谢谢你清理这一切。 - orlade
没问题。注意,如果要更改标签 username 在Auth表单中的字段,您可以通过指定标签 auth.messages.label_username (默认为“用户名”)。 - Anthony


答案:


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

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

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

在打电话之前 auth.define_tables(),这些额外的字段将附加到 auth_user 表。注意,如果默认情况下有一些字段 auth_user 您根本不想使用的表,您可以通过设置它们来隐藏它们在注册和配置文件表单中 readable 和 writable 属性到 False


16
2017-08-19 14:38



谢谢,安东尼!你是对的,那里有一些官方文件,你的解决方案比我的好。这一切似乎很合适。我注意到的另一件事是当我使用a定义我的自定义表时 username 字段,用户名用于登录而不是 email。这就是我想要的,这本书说它是内置的行为,这是特别好的!谢谢你清理这一切。 - orlade
没问题。注意,如果要更改标签 username 在Auth表单中的字段,您可以通过指定标签 auth.messages.label_username (默认为“用户名”)。 - Anthony