【问题标题】:web2py Custom User Profile?web2py 自定义用户配置文件?
【发布时间】:2011-10-30 13:44:12
【问题描述】:

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

我从谷歌上看到了一些方法,但似乎没有人给出直接的答案。答案似乎是用自定义表完全替换基本auth_user 表(并让身份验证系统知道),或者创建一个新的扩展表,其中包含指向基本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() 之前执行,一切似乎都正常。这些字段显示在用户个人资料页面上,其他所有内容仍按预期工作。

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

【问题讨论】:

    标签: web2py profile


    【解决方案1】:

    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 来将它们隐藏在注册和个人资料表单中。

    【讨论】:

    • 谢谢,安东尼!你是对的,那里有一些官方文档,你的解决方案比我的好。这一切似乎都很合适。我注意到的另一件事是,当我使用username 字段定义我的自定义表时,用户名用于登录而不是email。这就是我想要的,书上说它是内置的行为,非常好!感谢您清除所有这些。
    • 没问题。请注意,如果您想更改身份验证表单中username 字段的标签,您可以通过auth.messages.label_username 指定标签(默认为“用户名”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2017-02-10
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多