Как лучше всего расширить модель User (в комплекте с приложением аутентификации Django) с помощью пользовательских полей? Я также хотел бы использовать электронную почту в качестве имени пользователя (в целях аутентификации).
Я уже видел несколько способов сделать это, но не могу решить, какой из них лучший.
Ответы:
Наименее болезненный и действительно рекомендуемый Django способ сделать это - через
OneToOneField(User)
свойство.Тем не менее, расширение
django.contrib.auth.models.User
и вытеснение это также работает ...Я бы определенно держался подальше от изменения фактического класса User в вашем исходном дереве Django и / или копирования и изменения модуля auth.
источник
user = models.ForeignKey(User, unique=True)
это так же, какuser = models.OneToOneField(User)
? Я думаю, что конечный эффект такой же? Но, возможно, реализация в бэкэнде другая.Примечание: этот ответ устарел. см. другие ответы, если вы используете Django 1.7 или более позднюю версию.
Вот как я это делаю.
Это создаст userprofile каждый раз, когда пользователь сохраняется, если он создан. Вы можете использовать
Вот еще немного информации из документов
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Обновление: обратите внимание, что
AUTH_PROFILE_MODULE
устарела начиная с версии 1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-moduleисточник
user = models.ForeignKey( User )
, и получить объект профиля черезuser.get_profile()
. Не забудьтеfrom django.contrib.admin.models import User
.User
Что ж, с 2008 года прошло некоторое время, и пришло время для свежего ответа. Начиная с Django 1.5 вы сможете создавать пользовательский класс User. На самом деле, в то время, когда я пишу это, оно уже объединено с мастером, так что вы можете попробовать его.
Есть некоторая информация об этом в документах или, если вы хотите углубиться в это, в этом коммите .
Все, что вам нужно сделать, это добавить
AUTH_USER_MODEL
в настройки путь к пользовательскому классу пользователя, который расширяетсяAbstractBaseUser
(более настраиваемая версия) илиAbstractUser
(более или менее старый пользовательский класс, который вы можете расширить).Для людей, которым лень кликать, вот пример кода (взят из документации ):
источник
email
это имя пользователя.unique=True
в поле электронной почты, чтобыUSERNAME_FIELD
принять егоНачиная с Django 1.5 вы можете легко расширить пользовательскую модель и сохранить единую таблицу в базе данных.
Вы также должны настроить его как текущий класс пользователя в вашем файле настроек
Если вы хотите добавить множество пользовательских предпочтений, вариант OneToOneField может быть лучшим выбором.
Примечание для людей, разрабатывающих сторонние библиотеки: если вам нужен доступ к пользовательскому классу, помните, что люди могут его изменить. Используйте официальный помощник, чтобы получить правильный класс
источник
django_social_auth
, я рекомендую использовать отношения OneToOne. НЕ используйте этот метод, иначе он испортит ваши миграции.django_social_auth
плагин и определить AUTH_USER_MODEL для пользователя социальной аутентификации. Затем, когда я запустил manage.py migrate, это испортило мое приложение. Когда вместо этого я использовал модель социальной аутентификации пользователя в качестве отношения OneToOne, описанного здесь: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
источником: docs.djangoproject.com/en/dev/topics/auth/customizing/…Существует официальная рекомендация по хранению дополнительной информации о пользователях . Книга Джанго также обсуждает эту проблему в разделе Профили .
источник
Ниже приведен еще один подход к расширению пользователя. Я чувствую, что это более понятно, легко, читаемо, чем два подхода.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Используя вышеуказанный подход:
источник
Вы можете просто расширить профиль пользователя, создавая новую запись каждый раз, когда пользователь создается с помощью сигналов сохранения сообщений Django.
models.py
Это автоматически создаст экземпляр сотрудника при создании нового пользователя.
Если вы хотите расширить пользовательскую модель и добавить дополнительную информацию при создании пользователя, вы можете использовать django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Это создаст форму добавления пользователя со всеми полями, определенными в модели UserProfile.
models.py
forms.py
views.py
addUser.html
urls.py
источник
Расширение Django User Model (UserProfile) как профессионала
Я нашел это очень полезным: ссылка
Выписка:
из django.contrib.auth.models import User
источник
Новое в Django 1.5, теперь вы можете создать свою собственную пользовательскую модель (что, кажется, было бы хорошо в вышеупомянутом случае). См. «Настройка аутентификации в Django».
Вероятно, самая крутая новая функция в версии 1.5.
источник
Это то, что я делаю, и, на мой взгляд, это самый простой способ сделать это. определите менеджер объектов для вашей новой настроенной модели, затем определите вашу модель.
Не забудьте добавить эту строку кода в ваш
settings.py
:Это то, что я делаю, и это всегда работает.
источник
Начиная с Django 2.2, рекомендуемый способ при запуске нового проекта - создать пользовательскую модель, которая наследуется от AbstractUser, а затем указать AUTH_USER_MODEL на модель.
Источник: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
источник
Простой и эффективный подход - models.py
источник