web2py Пользовательский профиль пользователя? - PullRequest
11 голосов
/ 19 августа 2011

Каков «правильный» способ расширения базовой auth_user таблицы / всей системы auth для поддержки ряда пользовательских полей профиля пользователя (таких как имя пользователя, местоположение, день рождения и т. Д.)?

Я поймал взгляды подходов от Google, но никто никогда не давал прямого ответа.Кажется, что ответом является либо полная замена базовой таблицы auth_user пользовательской (и информирование системы аутентификации), либо создание новой таблицы расширений со ссылкой на внешний ключ обратно к базовой таблице auth_user.У первого, похоже, проблемы с возможностью повторного использования, у второго будут проблемы с формами и тому подобным.

У кого-нибудь есть какие-либо указатели, которые можно исправить во что-то столь же универсальное, как пользовательские профили, не ломая слишком много?1012 * РЕДАКТИРОВАТЬ: Немного больше чтения предлагает переопределение базовой таблицы 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')))
    ),
)

До тех пор, пока это выполняется после auth = Auth(db) и до auth.define_tables() в models / db.py, кажется, что все работает нормально.Поля отображаются на странице профиля пользователя, а все остальное по-прежнему работает, как и ожидалось.

Не уверен, как ответить на мой собственный вопрос, поэтому, если кто-то может объяснить , почему этоэто правильный способ сделать это, и что еще нужно иметь в виду, я буду признателен за это!

1 Ответ

16 голосов
/ 19 августа 2011

auth.settings.table_user_name хранит имя пользовательской таблицы (по умолчанию auth_user), а auth.settings.table_user является ссылкой на саму пользовательскую таблицу. Эти две настройки используются в другом месте в коде аутентификации, поэтому важно обновлять их при создании пользовательской таблицы (в вашем случае вам не нужно обновлять 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.

...