Пользовательский профиль пользователя web2py?
Что такое "правильный" способ расширения базовой таблицы auth_user
/ целая система auth
для поддержки ряда пользовательских пользователей (например, имя пользователя, местоположение, день рождения и т.д.)?
Я поймал взгляды подходов из Googling, но никто никогда не дает прямого ответа. Ответ, похоже, либо полностью заменяет базовую таблицу 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')))
),
)
Пока это выполняется после auth = Auth(db)
и до auth.define_tables()
в моделях /db.py, все это, похоже, работает нормально. Поля отображаются на странице профиля пользователя, а все остальное работает, как ожидалось.
Не уверен, как ответить на мой собственный вопрос, так что пока кто-то может объяснить, почему это правильный способ сделать это, и что еще нужно иметь в виду, я был бы признателен!
Ответы
Ответ 1
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
.