我希望创建一个用户的子集,这些用户没有登录...基本上是为了在照片中添加摄影师字段,而不必关联一个完整的帐户(因为在许多情况下,他们实际上永远不会登录到该站点)。但需要注意的是,我也希望稍后能够为他们启用帐户。
所以,我的问题是如何最好地设置一个“People”表,它与用户表相关联,而不实际扩展用户表与UserProfile。
所以,我的问题是如何最好地设置一个“People”表,它与用户表相关联,而不实际扩展用户表与UserProfile。
django.contrib.auth.models.User.get_profile
返回)不会扩展User表 - 你用AUTH_PROFILE_MODULE
设置指定的资料模型只是一个模型,其中包含对User的ForeignKey。 get_profile
和这个设置实际上只是一个方便的API,用于访问具有特定User实例的ForeignKey的特定模型的实例。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认证的文档中可以得知,如果您想使用用户模型,则必须拥有用户名和密码,没有“匿名账户”。我猜您可以创建一个默认密码的账户,然后让人们有机会启用“真实”的账户(通过自己设置密码)。
要设置与用户表相关联的“People”表,您只需使用ForeignKey字段(这实际上是添加其他信息到用户模型的推荐方式,而不是继承)
使用一个具有ForeignKey字段链接到User的模型可能不会按照您希望的方式工作,因为您需要匿名访问。我不确定那是否会起作用,但您可以尝试一下,看看如果您让它具有对AnonymousUser(其id始终为None!)的ForeignKey会发生什么。
如果您尝试了,请在此处发布您的结果,我会很好奇的。
django.contrib.auth.models.User 的存在仅用于使用默认的身份验证后端(基于数据库)。如果您编写自己的后端,可以使一些帐户无需密码,同时保留具有密码的普通帐户。Django 文档中有一个章节介绍了这个问题。
对insin的回答再次点赞:通过UserProfile
来处理这个问题。James Bennett有一篇很棒的文章,介绍了如何扩展django.contrib.auth.models.User
。他讲解了几种方法,解释了它们的优缺点,并最终确定了使用UserProfile
的方式是最理想的。