Django - 如何最佳处理用户和个人资料?
我正在写一个简单的网站,需要处理用户和他们的个人资料。最开始我想用Django自带的用户管理功能,但发现这个用户模型太简单了,里面没有我需要的字段。文档提到过用户个人资料,但关于用户个人资料的部分在讲解Django 1.0的书中已经删掉了(理想情况下,解决方案应该能在Django 1.2上使用),而网上各种解决方案让选择变得更加困难(比如用户模型继承、用户个人资料和Django信号等)。
我想知道,怎么才能以一种好的、现代的、快速的和安全的方式来写这个功能。我应该尝试扩展Django自带的用户模型,还是应该创建一个自己的用户模型,包含我需要的所有信息?下面是一些对工作解决方案的要求和期望:
- 用户应该能够注册和登录
- 每个用户都应该有个人资料(或者一个包含所有必要字段的模型)
- 用户不需要Django自带的管理面板,但他们需要通过简单的网页表单来编辑自己的个人资料/模型
请告诉我你们在应用中是如何解决这些问题的,以及目前用Django处理用户的最佳方法是什么。任何相关文章、博客或代码示例都非常感谢!
4 个回答
Django自带一个用户资料模型(UserProfile),你可以自己创建。这个功能在一开始就可以用,具体可以在你的 settings.py
文件里设置 AUTH_PROFILE_MODULE
。不过我同意你说的,刚开始用的时候确实有点让人困惑。
我处理这个问题的方法是创建一个自己的用户资料模型,里面包含我想要的字段,然后通过上面提到的设置把它和Django的用户模型连接起来。我觉得这样做是比较推荐的,可能比直接扩展基础用户模型要好。
你可以通过 User.get_profile()
来访问你的用户资料。
在github上有几个项目是专注于用户资料的。如果你想要一些代码示例,可以去那儿看看。
用户应该能够注册和登录。
你需要用到 django.contrib.auth
这个模块。一定要查看一下关于 自定义登录表单 的文档。
每个用户都应该有个人资料(或者说是包含所有必要字段的模型)。
你需要设置 settings.AUTH_PROFILE_MODULE
,正如其他人所提到的那样。
关于如何设置用户个人资料模型的信息,可以参考 最新版本、1.1 版本 和 1.0 版本 的文档。这些信息没有被删除。
用户不需要使用 Django 内置的管理面板,但他们需要通过简单的网页表单来编辑自己的个人资料/模型。
你可以像为其他应用一样创建一个表单和视图;也许可以做一个“用户控制面板”应用来处理这些事情。你的视图将与 django.contrib.auth.models.User
和 django.contrib.auth.models.Group
模型进行交互。你可以根据需要进行设置。
编辑:回应你的问题(请注意,Alex Trebek 在此)...
关于 Django 1.0 的第二版 djangobook(比 0.96 更接近 1.2),现在已经没有任何相关信息了,这让我感到非常困惑 - 有没有什么变化?有没有其他更好、更安全的方式来处理用户及其个人资料?所以才提出这个问题。
我不推荐 djangobook 作为参考;在这个话题上它已经过时了。用户个人资料是存在的,我在我的 Django 1.1.1 网站上也在使用它们;我甚至是从 NIS 中填充这些资料。
请使用我上面提供的链接。它们直接指向 实际的 Django 文档,是权威的。
顺便问一下,我忘了问,你们提到的那种方式(也就是 AUTH_PROFILE_MODULE)在注册时会自动创建吗?
文档中有回答。
并且在任何操作时都需要个人资料存在(没有现成的、填写好的个人资料的用户不应该存在,这就是我考虑以某种方式扩展用户模型的原因)?
如果调用 User.get_profile()
,那么个人资料需要存在。
它会被更新吗(人们在各种博客中提到“信号”与这个主题相关)?
这就像任何其他模型一样:只有在你更改字段并调用 save()
时,它才会被更新。
信号 部分是如何连接一个函数来为新用户创建个人资料的:
from django.db.models.signals import post_save
from django.contrib.auth import User
from myUserProfileApp import UserProfile
def make_user_profile(sender, **kwargs):
if 'created' not in kwargs or not kwargs['created']:
return
# Assumes that the `ForeignKey(User)` field in "UserProfile" is named "user".
profile = UserProfile(user=kwargs["instance"])
# Set anything else you need to in the profile, then...
profile.save()
post_save.connect(make_user_profile, sender=User, weak=False)
这只会为新用户创建一个新的个人资料。现有用户需要手动添加个人资料:
$ ./manage.py shell
>>> from django.contrib.auth import User
>>> from myUserProfileApp import UserProfile
>>> for u in User.objects.all():
... UserProfile(user=u).save() # Add other params as needed.
...
如果你有一些用户有个人资料而一些没有,你需要做更多的工作:
>>> for u in User.objects.all():
... try:
... UserProfile(user=u).save() # Add other params as needed.
... except:
... pass