Django - 如何以最佳方式编写用户和个人资料处理?

3

我正在编写一个简单的网站,需要处理用户和其个人资料。最初的想法是使用 Django 的内置用户处理功能,但是用户模型太过狭窄,不包含我所需要的字段。文档中提到了用户资料,但是在覆盖 Django 1.0 的 djangobook 中已经删除了用户资料部分(理想情况下,解决方案应该能够在 Django 1.2 中工作),而网络上充满了各种不同的解决方案,这让选择变得更加困难(例如用户模型继承、用户资料和 Django 信号等)。

我想知道如何以良好、现代、快速和安全的方式编写它。我应该尝试扩展 Django 内置的用户模型,还是应该创建自己的用户模型,以便足够宽泛地保存所有我需要的信息?以下是对工作解决方案的一些规格和期望:

  • 用户应该能够注册和认证
  • 每个用户都应该有个人资料(或包含所有必需字段的模型)
  • 用户不需要 Django 内置的管理面板,但需要通过简单的 Web 表单编辑其个人资料/模型

请告诉我您在应用程序中如何解决这些问题以及处理 Django 用户的最佳方式。高度欢迎提供任何链接到文章/博客或代码示例!


在这里,您可以找到有关Django用户的教程:http://lowcoupling.com/post/71289666862/django-the-user-tutorial 还有一个GitHub项目,您可以克隆并检查。 - lowcoupling
4个回答

12

用户应该能够注册和认证

django.contrib.auth是你需要的模块。一定要查看自定义登录表单的文档。

每个用户都应该有个配置文件(或者带有所有必需字段的模型)

你需要设置 settings.AUTH_PROFILE_MODULE,正如其他人所指出的。

有关设置用户配置文件模型的信息可在最新版本1.11.0中找到。它还未被删除。

用户不需要Django内置的管理面板,但需要通过简单的Web表单编辑其配置文件/模型

你可以创建一个表单和视图,就像处理任何其他应用程序一样;也许创建一个“用户控制面板”应用程序来处理这些事情。随后,你的视图将与 django.contrib.auth.models.Userdjango.contrib.auth.models.Group 模型交互。你可以设置它以满足你的需要。

编辑:回答你的问题(召唤Alex Trebek)...

djangobook第二版,涵盖django1.0(比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

2

0
Django支持(您自己创建的)UserProfile模型,并且可以立即使用out of the box。 您可以在settings.py文件中分配它:AUTH_PROFILE_MODULE。 话虽如此,我同意一开始可能有点困惑。
我是这样处理的,创建了自己的UserProfile模型,并通过设置将其与Django User模型连接起来(如上所述)。 我认为这是首选方式,也比扩展基本User模型更好。
你可以通过User.get_profile()访问个人资料。
Github上有几个与UserProfile相关的项目。 如果需要代码示例,可以在那里查找。

0
感谢大家的回答!我知道Django开发文档提到了用户配置文件,但只是简单地提了几句话,并链接到包含有关用户配置文件信息的Djangobook,但是...它是针对Django 0.96的第一个版本。覆盖Django 1.0的第二个版本(比0.96更接近1.2)不再在任何地方提供该信息,这让我非常困惑-是否有任何变化?是否有其他更好、更安全的处理用户及其配置文件的方法?因此提出这个问题。

顺便问一句,如果你们所提到的方式(即AUTH_PROFILE_MODULE)会在注册时自动创建,并要求在任何操作中都存在个人资料(没有现有用户,不应存在填充资料,这就是我在考虑如何扩展用户模型方面的原因),它也会得到更新吗(人们在与此主题相关的各种博客中提到了“信号”)? - SpankMe
当你这样做时,而不在我们的答案下留言,就无法让我们知道你是否回复了... - Mike DeSimone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接