4

我想创建一个没有登录名的用户子集......基本上作为一种在照片中添加摄影师字段的方式,而无需与该人关联的完整帐户(因为在许多情况下,他们会从未真正登录到该站点)。需要注意的是,我还希望以后能够为他们启用帐户。

因此,我认为问题变成了设置与 User 表相关联的“People”表而不用 UserProfile 实际扩展 User 表的最佳方法。

4

7 回答 7

8

用户配置文件(由 返回django.contrib.auth.models.User.get_profile)不会扩展 User 表 - 您指定为具有AUTH_PROFILE_MODULE设置的配置文件模型的模型只是具有ForeignKeyto的模型Userget_profile并且设置实际上只是一个方便的 API,用于访问具有特定实例的特定模型ForeignKeyUser实例。

因此,一种选择是创建一个配置文件模型,其中ForeignKey可以Usernull您的Photo模型与此配置文件模型而不是模型相关联User。这将允许您为不存在的用户创建配置文件,并在以后将注册用户附加到配置文件。

于 2008-10-05T14:53:46.883 回答
3

无法登录的用户?只是给了他们一个完全随机的密码。

import random
user.set_password( str(random.random()) )

他们将永远无法登录。

于 2008-10-05T18:57:26.020 回答
3

提供您自己的身份验证例程,然后您可以检查(或不检查)您喜欢的任何内容。我们这样做是为了如果他们在正常用户名上失败,我们也可以让他们通过电子邮件/密码进入(尽管这不是我在下面展示的内容)。

在 settings.py 中:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
 )

在 userprofile/my_authenticate.py 中:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class MyLoginBackend(ModelBackend):
    """Return User record if username + (some test) is valid.
       Return None if no match.
    """

    def authenticate(self, username=None, password=None, request=None):
        try:
            user = User.objects.get(username=username)
            # plus any other test of User/UserProfile, etc.
            return user # indicates success
        except User.DoesNotExist:
            return None
    # authenticate
# class MyLoginBackend
于 2008-10-07T00:40:41.067 回答
0

django auth的文档中,如果您想使用 User 模型,则必须拥有用户名和密码,没有“匿名帐户”。我想您可以使用默认密码创建帐户,然后让人们有机会启用“真实”帐户(通过自己设置密码)。

要设置与 User 表相关联的“People”表,您只需使用 ForeignKey 字段(这实际上是向 User 模型添加附加信息的推荐方法,而不是继承)

于 2008-10-05T14:56:24.553 回答
0

使用具有链接到 User 的 ForeignKey 字段的模型可能无法正常工作,因为您需要匿名访问。我不确定这是否可行,但你可以尝试如果你让它有一个到AnonymousUser的 ForeignKey (其 id 始终为 None!)会发生什么。

如果您尝试一下,请在此处发布您的结果,我会很好奇。

于 2008-10-06T22:31:06.413 回答
0

django.contrib.auth.models.User 的存在仅用于使用默认身份验证后端(基于数据库)。如果您编写自己的后端,则可以使某些帐户无密码,同时保持普通帐户有密码。Django 文档对此有一个章节

于 2008-10-07T09:23:25.630 回答
0

另一个对insin 答案的支持:通过UserProfile. James Bennett有一篇关于扩展的好文章django.contrib.auth.models.User。他介绍了几种方法,解释了它们的优缺点,并最终实现了UserProfile理想。

于 2008-10-07T22:09:42.917 回答