我想创建一个没有登录名的用户子集......基本上作为一种在照片中添加摄影师字段的方式,而无需与该人关联的完整帐户(因为在许多情况下,他们会从未真正登录到该站点)。需要注意的是,我还希望以后能够为他们启用帐户。
因此,我认为问题变成了设置与 User 表相关联的“People”表而不用 UserProfile 实际扩展 User 表的最佳方法。
我想创建一个没有登录名的用户子集......基本上作为一种在照片中添加摄影师字段的方式,而无需与该人关联的完整帐户(因为在许多情况下,他们会从未真正登录到该站点)。需要注意的是,我还希望以后能够为他们启用帐户。
因此,我认为问题变成了设置与 User 表相关联的“People”表而不用 UserProfile 实际扩展 User 表的最佳方法。
用户配置文件(由 返回django.contrib.auth.models.User.get_profile
)不会扩展 User 表 - 您指定为具有AUTH_PROFILE_MODULE
设置的配置文件模型的模型只是具有ForeignKey
to的模型User
。get_profile
并且设置实际上只是一个方便的 API,用于访问具有特定实例的特定模型ForeignKey
的User
实例。
因此,一种选择是创建一个配置文件模型,其中ForeignKey
可以User
将null
您的Photo
模型与此配置文件模型而不是模型相关联User
。这将允许您为不存在的用户创建配置文件,并在以后将注册用户附加到配置文件。
无法登录的用户?只是给了他们一个完全随机的密码。
import random
user.set_password( str(random.random()) )
他们将永远无法登录。
提供您自己的身份验证例程,然后您可以检查(或不检查)您喜欢的任何内容。我们这样做是为了如果他们在正常用户名上失败,我们也可以让他们通过电子邮件/密码进入(尽管这不是我在下面展示的内容)。
在 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
从django auth的文档中,如果您想使用 User 模型,则必须拥有用户名和密码,没有“匿名帐户”。我想您可以使用默认密码创建帐户,然后让人们有机会启用“真实”帐户(通过自己设置密码)。
要设置与 User 表相关联的“People”表,您只需使用 ForeignKey 字段(这实际上是向 User 模型添加附加信息的推荐方法,而不是继承)
使用具有链接到 User 的 ForeignKey 字段的模型可能无法正常工作,因为您需要匿名访问。我不确定这是否可行,但你可以尝试如果你让它有一个到AnonymousUser的 ForeignKey (其 id 始终为 None!)会发生什么。
如果您尝试一下,请在此处发布您的结果,我会很好奇。
django.contrib.auth.models.User 的存在仅用于使用默认身份验证后端(基于数据库)。如果您编写自己的后端,则可以使某些帐户无密码,同时保持普通帐户有密码。Django 文档对此有一个章节。
另一个对insin 答案的支持:通过UserProfile
. James Bennett有一篇关于扩展的好文章django.contrib.auth.models.User
。他介绍了几种方法,解释了它们的优缺点,并最终实现了UserProfile
理想。