我正在制作一个SAAS,我一直在询问有关内置Auth系统的一系列问题。我无法理解“为什么”和“如何”。主要是我不明白它如何适应我的SAAS。
class MyUserProfile(models.Model):
"""
Administrator for an Account. Can edit tickets and other stuff.
"""
user = AutoOneToOneField(User, primary_key=True)
account = models.ForeignKey(Account)
dogs_name = models.CharField(max_length=255)
在上一个示例中,account
正是您所期望的;支付使用我的软件的实体。 user
是我的主要关注点。有人进入页面并使用用户名和密码等创建UserProfile
。当他们这样做时,相关用户在哪里创建?我是否需要根据request.POST ['username']等手动在我的视图中创建它,然后执行
myuserprof = MyUserProfile.create(user=foo_user_just_created, account=foo_account, dogs_name='Spot')
我不知道为什么但是由于某种原因我觉得我错过了什么。这个想法让某人注册一个帐户,然后创建一个MyUserProfile,其表单要求输入密码,用户名,电子邮件等,然后在我的视图中创建2个不同的对象(MyUserProfile和User),其中包含不同的部分表格数据。我的意思是我不应该有用户表格吗?就像我说的那样,我觉得我要么跳过一步,要么就是错误的范式。我不是Django的新手,但由于某种原因,我对我没有构建的东西有困难(我认为这可能是一个真正的心理问题)。
也许有一个很好的例子就是在某个开源项目上做了这样的事情。
更新:哎呀,忘了提到在上面的代码中我试图使用来自django-annoying的AutoOneToOneField,但我不知道所有用户的属性设置在哪里或如何决定要附加到哪个User对象。这件事让我发疯。另外,我是否需要使用sites
应用程序来执行此操作,最后“超级用户”拥有对所有内容的所有权限(我不希望帐户“Acme”中的人员访问帐户“微轴”物体)?或者他们只拥有所有观点的所有权限?
答案 0 :(得分:3)
有人进入某个页面并使用用户名和密码等创建
UserProfile
UserProfile
没有用户名或密码字段。所以它应该是某人进入页面并创建User
。然后,它会创建与新创建的UserProfile
相关联的User
。
问题是,您希望如何以及何时创建此UserProfile
实例?
User
时:使用信号,如in the docs所述AutoOneToOneField
,并使用user.userprofile
代替user.get_profile()
UserProfile
,因此user.get_profile()
可能会引发DoesNotExist
例外。当他们这样做时,相关用户在哪里创建?
没有。你必须明确地创建它。
这个想法让某人注册一个帐户,然后创建一个MyUserProfile,其表单要求输入密码,用户名,电子邮件等,然后在我的视图中创建2个不同的对象(MyUserProfile和User)与表单数据的不同部分。我的意思是我不应该有用户表格吗?
为什么不呢?你想在这里一次创建一个User
及其相关的个人资料,对吧?您最终可以直接使用POST
数据,或使用Form
来访问字段,甚至更好地使用2 ModelForm
(一个用于User
,一个用于{ {1}})您将在同一视图中处理(也许this question可以提供帮助吗?)
也许有一个很好的例子就是在某个开源项目上做了这样的事情。
我建议您查看django-registration和django-profiles。
您可以通过扩展模型来向UserProfile
对象添加信息。它允许您将额外的字段直接放在用户模型中,并且可能更容易理解和使用。
我不会在此处深入了解详细信息,请查看that tutorial了解更多信息。
我尝试使用django-annoying中的AutoOneToOneField,但我不知道所有用户属性的设置位置或如何决定要附加到哪个User对象。这件事让我发疯了
见上文关于如何使用它。如果您对此感到不舒服,最好遵循the documentation,建议在用户个人资料中使用User
ForeignKey
。
另外,我是否需要使用网站应用来执行此操作
来自site framework docs:如果您的单个Django安装支持多个站点,则需要使用它,您需要以某种方式区分这些站点。
最后“超级用户”拥有对所有内容的所有权限(我不希望帐户“Acme”中的人访问帐户“Microshaft”对象)?
同样,来自docs,指定此用户拥有所有权限而未明确指定。这意味着无论Django使用built-in permission system(例如默认管理页面),都会授权超级用户。
在观看中,您自己写作,或者如果您调整了一些unique=True
,则由您来决定如何检查权限。