【问题标题】:Django - how to write users and profiles handling in best way?Django - 如何以最佳方式编写用户和配置文件处理?
【发布时间】:2011-02-08 22:15:22
【问题描述】:

我正在编写需要处理用户和个人资料的简单网站。最初的想法是在用户处理中使用django的构建,但是用户模型太窄并且不包含我需要的字段。文档中提到了用户配置文件,但用户配置文件部分已从涵盖 django 1.0 的 djangobook 中删除(理想情况下,该解决方案应与 django 1.2 一起使用),并且互联网上充满了不同的解决方案,并没有使选择变得更容易(如用户模型继承,用户配置文件和 django 信号等)。

我想知道,如何以良好、现代、快速和安全的方式编写此代码。我应该尝试扩展 django 内置用户模型,还是应该创建自己的用户模型足够宽以保留我需要的所有信息?您可以在下面找到工作解决方案的一些规范和期望:

  • 用户应该能够注册和验证
  • 每个用户都应该有个人资料(或具有所有必填字段的模型)
  • 用户不需要 django 内置管理面板,但他们需要通过简单的 Web 表单编辑他们的配置文件/模型

请告诉我您如何解决应用程序中的这些问题,以及当前使用 django 处理用户的最佳方式是什么。非常感谢任何文章/博客或代码示例的链接!

【问题讨论】:

标签: python django profiles


【解决方案1】:

用户应该能够注册和验证

django.contrib.auth 是你想要的模块。请务必查看 custom login forms. 的文档

每个用户都应该有个人资料(或具有所有必填字段的模型)

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

有关设置用户配置文件模型的信息适用于 the latest version1.11.0。它没有被丢弃。

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

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

编辑:以答案形式回答您的问题(寻呼 Alex Trebek)...

djangobook 的第二个版本,涵盖 django 1.0(比 0.96 更接近 1.2)在任何地方都没有该信息,是什么让我非常困惑 - 有什么变化吗?还有其他更好、更安全的方式来处理用户及其个人资料吗?因此提出了这个问题。

我不推荐 djangobook 作为参考;这个话题已经过时了。存在用户配置文件,我在我的 Django 1.1.1 站点中使用它们;我什至从 NIS 中填充它们。

请使用我上面提供的链接。它们直接访问实际的 Django 文档,并且具有权威性。

对了,我忘了问,你们指的方式(也就是AUTH_PROFILE_MODULE)会不会在注册的时候自动创建

在文档中回答。

并要求配置文件在任何操作时都存在(不存在现有的填充配置文件的用户不应该存在,这就是我考虑以某种方式扩展用户模型的原因)?

如果调用User.get_profile(),则该配置文件需要存在。

它也会更新吗(人们在与此主题相关的各种博客上都提到了“信号”)?

它与任何其他模型一样:只有在您更改字段并调用 save() 时才会更新。

signal 部分是您如何挂钩一个函数来为新用户创建配置文件:

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】:

    在我看来,当前版本的 Django 文档和 Django 书籍都有这方面的部分。

    【讨论】:

      【解决方案3】:

      Django 支持 UserProfile 模型(您自己创建的)权利out of the box。您可以在您的settings.py 文件中分配它:AUTH_PROFILE_MODULE。话虽如此,我同意你的观点,一开始有点令人困惑。

      我的处理方式是使用我想要的字段创建我自己的 UserProfile 模型,并通过设置(上图)将其挂接到 Django User 模型中。我相信这是首选方式,并且可能比扩展基本用户模型更好。

      您可以通过User.get_profile()访问您的个人资料。

      在 github 上有几个面向 UserProfile 的项目。如果你想要一些代码示例,你可以看看那里。

      【讨论】:

        【解决方案4】:

        谢谢大家的回答!我知道 django 开发文档提到了用户配置文件,但它非常简短(大约几行)并链接到 djangobook 包含有关用户配置文件的信息,但是......到它的第一个版本,涵盖 django 0.96。 djangobook 的第二个版本,涵盖 django 1.0(比 0.96 更接近 1.2)在任何地方都不再有该信息,是什么让我非常困惑 - 有什么改变吗?还有其他更好、更安全的方式来处理用户及其个人资料吗?因此提出了这个问题。

        【讨论】:

        • 对了,我忘了问,如果你们都提到的方式(即AUTH_PROFILE_MODULE)会在注册时自动创建,并要求配置文件在任何操作时都存在(用户不存在,填写profile 不应该存在,这就是为什么我想以某种方式扩展用户模型)?它也会更新吗(人们在与此主题相关的各种博客上都提到了“信号”)?
        • 当您这样做并且不对我们的答案发表评论时,它不会告诉我们任何人您已回复...
        猜你喜欢
        • 2015-06-29
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多