在 Django 中扩展用户模型的最佳方法是什么?
使用自定义字段扩展用户模型(与 Django 的身份验证应用程序捆绑在一起)的最佳方法是什么? 我也可能想使用电子邮件作为用户名(用于身份验证目的)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
使用自定义字段扩展用户模型(与 Django 的身份验证应用程序捆绑在一起)的最佳方法是什么? 我也可能想使用电子邮件作为用户名(用于身份验证目的)。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(17)
注意:此答案已被弃用。 如果您使用的是 Django 1.7 或更高版本,请参阅其他答案。
这就是我的做法。
如果创建的话,每次保存用户时都会创建一个用户配置文件。
然后,您可以使用
以下是文档中的更多信息
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
更新:请注意
AUTH_PROFILE_MODULE
自 v1.5 起已弃用: https:// /docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-moduleNote: this answer is deprecated. see other answers if you are using Django 1.7 or later.
This is how I do it.
This will create a userprofile each time a user is saved if it is created.
You can then use
Here is some more info from the docs
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Update: Please note that
AUTH_PROFILE_MODULE
is deprecated since v1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-module2008 年已经过去了一段时间,是时候给出一些新的答案了。 从 Django 1.5 开始,您将能够创建自定义 User 类。 实际上,在我写这篇文章的时候,它已经合并到 master 中了,所以你可以尝试一下。
docs 中有一些关于它的信息,或者如果您想挖掘的话更深入地了解它,在此提交中。
您所要做的就是将 AUTH_USER_MODEL 添加到带有自定义用户类路径的设置中,该类扩展了
AbstractBaseUser
(更可自定义的版本)或AbstractUser
(您可以扩展或多或少的旧用户类)。对于那些懒得点击的人,这里是代码示例(取自 docs ):
Well, some time passed since 2008 and it's time for some fresh answer. Since Django 1.5 you will be able to create custom User class. Actually, at the time I'm writing this, it's already merged into master, so you can try it out.
There's some information about it in docs or if you want to dig deeper into it, in this commit.
All you have to do is add
AUTH_USER_MODEL
to settings with path to custom user class, which extends eitherAbstractBaseUser
(more customizable version) orAbstractUser
(more or less old User class you can extend).For people that are lazy to click, here's code example (taken from docs):
从 Django 1.5 开始,您可以轻松扩展用户模型并在数据库中保留单个表。
您还必须在设置文件中将其配置为当前用户类别。
如果您想添加大量用户的首选项,OneToOneField 选项可能是更好的选择。
开发第三方库的人员请注意:如果您需要访问用户类,请记住人们可以更改它。 使用官方助手获取正确的类
Since Django 1.5 you may easily extend the user model and keep a single table on the database.
You must also configure it as current user class in your settings file
If you want to add a lot of users' preferences the OneToOneField option may be a better choice thought.
A note for people developing third party libraries: if you need to access the user class remember that people can change it. Use the official helper to get the right class
每次创建用户时创建一个新条目来简单地扩展用户配置文件。
您可以通过使用 Django post save signal models.py
这将在创建新用户时自动创建一个员工实例。
如果您希望扩展用户模型并希望在创建用户时添加更多信息,您可以使用 django-betterforms (http://django-betterforms.readthedocs.io/en/latest/multiform.html)。 这将创建一个用户添加表单,其中包含 UserProfile 模型中定义的所有字段。
models.py
forms.py
视图.py
addUser.html
urls.py
You can Simply extend user profile by creating a new entry each time when a user is created by using Django post save signals
models.py
This will automatically create an employee instance when a new user is created.
If you wish to extend user model and want to add further information while creating a user you can use django-betterforms (http://django-betterforms.readthedocs.io/en/latest/multiform.html). This will create a user add form with all fields defined in the UserProfile model.
models.py
forms.py
views.py
addUser.html
urls.py
下面是扩展用户的另一种方法。
我觉得它比上面两种方法更清晰、简单、可读。
http://scottbarnham.com/ blog/2008/08/21/extending-the-django-user-model-with-inheritance/
使用上述方法:
user.get_profile().newattribute 访问附加信息
与用户相关,
额外的新属性通过
用户.新属性
The below one is another approach to extend an User.
I feel it is more clear,easy,readable then above two approaches.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Using above approach:
user.get_profile().newattribute to access the additional information
related to the user
additional new attributes via
user.newattribute
有一个官方建议存储有关的其他信息用户。
Django Book还在配置文件部分讨论了这个问题。
There is an official recommendation on storing additional information about users.
The Django Book also discusses this problem in section Profiles.
像专业人士一样扩展 Django 用户模型 (UserProfile)
我发现这非常有用:链接
摘录:
Extending Django User Model (UserProfile) like a Pro
I've found this very useful: link
An extract:
在 Django 3.0+ 版本中这非常简单(如果您不在项目中):
在 models.py
中 在 settings.py 中
首先,注册您的新应用,然后注册AUTH_PASSWORD_VALIDATORS
最后
,在管理员中注册您的模型,运行 makemigrations 并迁移,即可成功完成。
官方文档: https://docs .djangoproject.com/en/3.2/topics/auth/customizing/#substituting-a-custom-user-model
It's very easy in Django version 3.0+ (If you are NOT in the middle of a project):
In models.py
In settings.py
First, register your new app and then below AUTH_PASSWORD_VALIDATORS
add
Finally, register your model in the admin, run makemigrations and migrate, and it will be completed successfully.
Official doc: https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#substituting-a-custom-user-model
在这里我试图解释如何使用额外的字段扩展 Django 的默认用户模型
非常简单,只要做就可以了。
Django 允许使用 AbstractUser 扩展默认用户模型
注意:- 首先创建一个要添加到用户模型中的额外字段模型,然后运行命令 python manage。 py makemigrations 和 python manage.py migrate
首次运行 ---> python manage.py makemigrations 然后
第二次运行 python manage.py migrate
步骤:- 创建一个模型,其中包含要添加到 Django 默认用户模型中的额外字段(在我的例子中)我创建了 CustomUser
model.py
在 settings.py 中添加您在我的案例中创建的模型名称 CustomUser 是注册的用户模型。 setttings.py 使其成为默认用户模型,
最后在 admin.py 中注册 CustomUser 模型
#admin.py
然后运行命令 python manage.py makemigrations
然后 python manage.py migrate
然后 python manage.py createsuperuser
现在你可以看到你的模型 默认用户模型扩展为 (mobile_no ,date_of_birth)
Here I tried to explain how to extend Django's Default user model with extra fields
It's very simple just do it.
Django allows extending the default user model with AbstractUser
Note:- first create an extra field model which you want to add in user model then run the command python manage.py makemigrations and python manage.py migrate
first run ---> python manage.py makemigrations then
second run python manage.py migrate
Step:- create a model with extra fields which you want to add in Django default user model (in my case I created CustomUser
model.py
add in settings.py name of your model which you created in my case CustomUser is the user model. registred in setttings.py to make it the default user model,
finally registred CustomUser model in admin.py
#admin.py
then run command python manage.py makemigrations
then python manage.py migrate
then python manage.py createsuperuser
now you can see your model Default User model extended with (mobile_no ,date_of_birth)
Django 1.5 中的新增功能,现在您可以创建自己的自定义用户模型(在上述情况下这似乎是一件好事)。 请参阅 '在 Django 中自定义身份验证'
可能是 1.5 版本中最酷的新功能。
New in Django 1.5, now you can create your own Custom User Model (which seems to be good thing to do in above case). Refer to 'Customizing authentication in Django'
Probably the coolest new feature on 1.5 release.
已经太晚了,但我的答案是针对那些使用最新版本的 Django 寻找解决方案的人。
models.py
:您可以在如下模板中使用它:
以及在
views.py
中使用它,如下所示:It's too late, but my answer is for those who search for a solution with a recent version of Django.
models.py
:you can use it in templates like this:
and in
views.py
like this:目前从 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
Currently as of Django 2.2, the recommended way when starting a new project is to create a custom user model that inherits from AbstractUser, then point AUTH_USER_MODEL to the model.
Source: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
简单有效的方法是
模型.py
Simple and effective approach is
models.py
试试这个:
创建一个名为
Profile
的模型,并使用OneToOneField
引用用户,并提供lated_name
选项。models.py
现在,要使用
User
对象直接访问配置文件,您可以使用lated_name
。views.py
Try this:
Create a model called
Profile
and reference the user with aOneToOneField
and provide an option ofrelated_name
.models.py
Now to directly access the profile using a
User
object you can use therelated_name
.views.py
我建议 替换自定义用户模型 比 扩展现有的用户模型。
替换自定义用户模型:
用户名
和密码
身份验证更改为电子邮件
和密码
身份验证。*您可以查看我的回答,解释如何设置
电子邮件
和password
身份验证 AbstractUser 或 AbstractBaseUser 和 PermissionsMixin,你可以看到我的答案 和我的回答解释了AbstractUser<之间的区别/code> 和
AbstractBaseUser
。扩展现有的用户模型:
用户名
和密码
身份验证更改为电子邮件
和密码
身份验证。*您可以看到我的回答解释了如何扩展 用户model 添加额外字段 OneToOneField()。
I recommend Substituting a custom User model which is more customizable than Extending the existing User model.
Substituting a custom User model:
username
andpassword
authentication toemail
andpassword
authentication.*You can see my answer explaining how to set up
email
andpassword
authentication with AbstractUser or AbstractBaseUser and PermissionsMixin and you can see my answer and my answer explaining the difference betweenAbstractUser
andAbstractBaseUser
.Extending the existing User model:
username
andpassword
authentication toemail
andpassword
authentication.*You can see my answer explaining how to extend User model to add extra fields with OneToOneField().
这就是我所做的,并且在我看来这是最简单的方法。 为您的新定制模型定义对象管理器,然后定义您的模型。
不要忘记在您的
settings.py
中添加这行代码:这就是我所做的,它总是有效的。
This is what i do and it's in my opinion simplest way to do this. define an object manager for your new customized model then define your model.
Dont forget to add this line of code in your
settings.py
:This is what i do and it always works.
最不痛苦且确实是 Django 推荐的方法是通过
OneToOneField(User)
属性。也就是说,扩展 django.contrib.auth.models.User 并取代它也可以...
我绝对不会更改实际的 User 类在您的 Django 源代码树中和/或复制并更改 auth 模块。
The least painful and indeed Django-recommended way of doing this is through a
OneToOneField(User)
property.That said, extending
django.contrib.auth.models.User
and supplanting it also works...I would definitely stay away from changing the actual User class in your Django source tree and/or copying and altering the auth module.