Django UserProfile…没有密码
-
05-07-2019 - |
题
我想创建一个没有登录信息的用户子集......基本上是一种将摄影师字段添加到照片而不需要与该人关联的完整帐户的方法(因为在很多情况下,他们永远不会真正登录该网站)。需要注意的是,我还希望以后能够为他们启用帐户。
所以,我认为问题变成了建立“人”的最佳方式。绑定到User表而不实际使用UserProfile扩展User表的表。
解决方案
用户个人资料 (由 django.contrib.auth.models.User.get_profile
返回)不会扩展User表 - 您使用 AUTH_PROFILE_MODULE
设置指定为配置文件模型的模型只是一个具有 ForeignKey
到 User
的模型。 get_profile
,该设置实际上只是一个方便的API,用于访问特定模型的实例,该模型具有 ForeignKey
到特定的 User
实例。 / p>
因此,一个选项是创建一个配置文件模型,其中 ForeignKey
到 User
可以是 null
并关联你的使用此配置文件模型而不是
模型。这将允许您为不存在的用户创建配置文件,并在以后将注册用户附加到配置文件。 User
模型的Photo
其他提示
无法登录的用户?只是给他们一个完全随机的密码。
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表的表只需要使用ForeignKey字段(实际上是推荐的方式向用户模型添加附加信息,而不是继承)
使用带有ForeignKey的模型链接到用户的字段可能无法正常工作,因为您需要匿名访问。我不确定这是否会起作用,但如果你让它有一个ForeignKey AnonymousUser (其id始终为None!)代替。
如果您尝试,请在此处发布结果,我会很好奇。
django.contrib.auth.models.User仅用于使用默认身份验证后端(基于数据库)。如果您编写自己的后端,则可以使某些帐户无密码,同时保留带有密码的普通帐户。 Django文档有一个章节。
insin的答案的另一个投票:通过处理此问题用户配置代码>。 James Bennett 有关于扩展
django.contrib.auth.models.User
的好文章。他介绍了几种方法,解释了它们的优点/缺点,并以 UserProfile
的方式着陆。