Django - 如何最佳处理用户和个人资料?

3 投票
4 回答
3063 浏览
提问于 2025-04-15 21:41

我正在写一个简单的网站,需要处理用户和他们的个人资料。最开始我想用Django自带的用户管理功能,但发现这个用户模型太简单了,里面没有我需要的字段。文档提到过用户个人资料,但关于用户个人资料的部分在讲解Django 1.0的书中已经删掉了(理想情况下,解决方案应该能在Django 1.2上使用),而网上各种解决方案让选择变得更加困难(比如用户模型继承、用户个人资料和Django信号等)。

我想知道,怎么才能以一种好的、现代的、快速的和安全的方式来写这个功能。我应该尝试扩展Django自带的用户模型,还是应该创建一个自己的用户模型,包含我需要的所有信息?下面是一些对工作解决方案的要求和期望:

  • 用户应该能够注册和登录
  • 每个用户都应该有个人资料(或者一个包含所有必要字段的模型)
  • 用户不需要Django自带的管理面板,但他们需要通过简单的网页表单来编辑自己的个人资料/模型

请告诉我你们在应用中是如何解决这些问题的,以及目前用Django处理用户的最佳方法是什么。任何相关文章、博客或代码示例都非常感谢!

4 个回答

0

Django自带一个用户资料模型(UserProfile),你可以自己创建。这个功能在一开始就可以用,具体可以在你的 settings.py 文件里设置 AUTH_PROFILE_MODULE。不过我同意你说的,刚开始用的时候确实有点让人困惑。

我处理这个问题的方法是创建一个自己的用户资料模型,里面包含我想要的字段,然后通过上面提到的设置把它和Django的用户模型连接起来。我觉得这样做是比较推荐的,可能比直接扩展基础用户模型要好。

你可以通过 User.get_profile() 来访问你的用户资料。

在github上有几个项目是专注于用户资料的。如果你想要一些代码示例,可以去那儿看看。

2

我觉得现在的Django文档和Django书籍都有相关的部分。

  • 这个链接 讲的是如何使用 AUTH_PROFILE_MODULE 来指定一个模型类,这个模型类用来存储额外的用户信息。
  • 这个链接 也是在讲类似的内容。
12

用户应该能够注册和登录。

你需要用到 django.contrib.auth 这个模块。一定要查看一下关于 自定义登录表单 的文档。

每个用户都应该有个人资料(或者说是包含所有必要字段的模型)。

你需要设置 settings.AUTH_PROFILE_MODULE,正如其他人所提到的那样。

关于如何设置用户个人资料模型的信息,可以参考 最新版本1.1 版本1.0 版本 的文档。这些信息没有被删除。

用户不需要使用 Django 内置的管理面板,但他们需要通过简单的网页表单来编辑自己的个人资料/模型。

你可以像为其他应用一样创建一个表单和视图;也许可以做一个“用户控制面板”应用来处理这些事情。你的视图将与 django.contrib.auth.models.Userdjango.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

撰写回答