我想创建一个没有登录信息的用户子集......基本上是一种将摄影师字段添加到照片中而无需与该人关联的完整帐户的方法(因为在很多情况下,他们永远不会真正登录该网站)。需要注意的是,我还希望以后能够为他们启用帐户。
所以,我认为这个问题变成了设置一个与User表绑定的“People”表的最佳方法,而没有用UserProfile实际扩展User表。
答案 0 :(得分:7)
user profile(由django.contrib.auth.models.User.get_profile
返回)不会扩展User表 - 您指定的模型作为具有AUTH_PROFILE_MODULE
设置的配置文件模型只是一个具有ForeignKey
到User
。 get_profile
该设置实际上只是一个方便的API,用于访问特定模型的实例,该实例具有ForeignKey
到特定User
实例。
因此,一种选择是创建一个配置文件模型,其中ForeignKey
到User
可以是null
,并将您的Photo
模型与此配置文件模型相关联,而不是User
模型。这将允许您为不存在的用户创建配置文件,并在以后将注册用户附加到配置文件。
答案 1 :(得分:3)
无法登录的用户?只是给他们一个完全随机的密码。
import random
user.set_password( str(random.random()) )
他们永远无法登录。
答案 2 :(得分: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
答案 3 :(得分:0)
从django auth上的文档中,如果您想使用用户模型,则必须拥有用户名和密码,没有“匿名帐户”。我想你可以使用默认密码创建帐户,然后让人们有机会启用“真实”帐户(通过自己设置密码)。
要设置一个与User表绑定的“People”表,您只需使用ForeignKey字段(实际上是向User模型添加附加信息的recommended way,而不是继承)
答案 4 :(得分:0)
使用model with a ForeignKey field linking to User可能无法正常工作,因为您需要匿名访问。我不确定这是否会起作用,但你可以尝试一下,如果你让它有一个到AnonymousUser的外键(其ID始终为无!),会发生什么。
如果您尝试,请在此处发布结果,我会很好奇。
答案 5 :(得分:0)
django.contrib.auth.models.User仅用于使用默认身份验证后端(基于数据库)。如果您编写自己的后端,则可以使某些帐户无密码,同时保留带有密码的普通帐户。 Django文档有一个chapter on this。
答案 6 :(得分:0)
insin's answer的另一个upvote:通过UserProfile
处理此问题。 James Bennett有一个关于django.contrib.auth.models.User
扩展的great article。他介绍了几种方法,解释了它们的优点/缺点,并以UserProfile
的方式着陆。