使用 django-all-auth 实现多个配置文件
implementing multiple profiles with django-all-auth
这里是 Django noob - 我最近被指向 registering/handling 用户的 django-all-auth,我发现它的即时设置非常棒。
但是,我在尝试实施多个用户配置文件模型时遇到了困难。在阅读其他答案时,我发现 this 是迄今为止最接近的答案,但并不是我真正需要的。
在编写我自己的基本注册时,用户会 select 一个帐户类型(例如基本、专业、精英——每个都是他们自己的个人资料模型)。根据 link selected,注册表单将显示通用用户注册表单以及用户选择类型的个人资料表单。
我知道我可以走得更远,以完全自定义所有身份验证并使类似的东西起作用,但我希望被指出的方向对原始应用程序的破坏更少。我考虑过让用户在注册后重定向以选择配置文件类型,但这似乎需要很多额外的步骤。
感谢您的帮助!
要扩展基本用户class,只需subclass AbstractUser。您可以在 docs 中找到它。有了这个,您可以添加基本用户缺少的字段。
现在,您想要具有不同字段的几种类型的配置文件,或者也许是相同的字段但每次都添加新字段。
您可以创建如下内容:
class ProfileBase(models.Model):
user=models.OneToOneField(User)
class ProfilePro(ProfileBase):
pro_field=models.SomeField(Foo)
#You can extend ProfilePro here if you want it to include the pro_field
class ProfileElite(ProfileBase):
elite_field=models.someField(Bar)
有了这些模型后,创建表单应该很容易。
请注意,当您以这种方式 subclass 时,django 会为每个模型创建 1 table,包括仅在 subclass table 上的新字段。这使得每个继承级别都有必要进行连接,因此请尽量不要滥用它。
还有第二种使用继承的方式:
class ProfileBase(models.Model):
user=models.OneToOneField(User)
class Meta:
abstract=True
如果您将基础 class 定义为抽象的,您将没有 table,因此您无法为该模型创建对象,但是您的每个子classes 将独立 table。如果您这样做,您可能需要额外的逻辑来处理用户更改个人资料类型(即从专业人士变为精英人士)的情况。
为了将它与 django-allauth 分开,只需完成注册(创建一个表单并在您的设置中定义 ACCOUNT_SIGNUP_FORM_CLASS 以使用您的基本信息覆盖所有授权默认值 + 选择一个配置文件类型表单)和一旦您的用户登录,将他们重定向到他们的个人资料以完成该过程。
这里是 Django noob - 我最近被指向 registering/handling 用户的 django-all-auth,我发现它的即时设置非常棒。
但是,我在尝试实施多个用户配置文件模型时遇到了困难。在阅读其他答案时,我发现 this 是迄今为止最接近的答案,但并不是我真正需要的。
在编写我自己的基本注册时,用户会 select 一个帐户类型(例如基本、专业、精英——每个都是他们自己的个人资料模型)。根据 link selected,注册表单将显示通用用户注册表单以及用户选择类型的个人资料表单。
我知道我可以走得更远,以完全自定义所有身份验证并使类似的东西起作用,但我希望被指出的方向对原始应用程序的破坏更少。我考虑过让用户在注册后重定向以选择配置文件类型,但这似乎需要很多额外的步骤。
感谢您的帮助!
要扩展基本用户class,只需subclass AbstractUser。您可以在 docs 中找到它。有了这个,您可以添加基本用户缺少的字段。
现在,您想要具有不同字段的几种类型的配置文件,或者也许是相同的字段但每次都添加新字段。
您可以创建如下内容:
class ProfileBase(models.Model):
user=models.OneToOneField(User)
class ProfilePro(ProfileBase):
pro_field=models.SomeField(Foo)
#You can extend ProfilePro here if you want it to include the pro_field
class ProfileElite(ProfileBase):
elite_field=models.someField(Bar)
有了这些模型后,创建表单应该很容易。 请注意,当您以这种方式 subclass 时,django 会为每个模型创建 1 table,包括仅在 subclass table 上的新字段。这使得每个继承级别都有必要进行连接,因此请尽量不要滥用它。
还有第二种使用继承的方式:
class ProfileBase(models.Model):
user=models.OneToOneField(User)
class Meta:
abstract=True
如果您将基础 class 定义为抽象的,您将没有 table,因此您无法为该模型创建对象,但是您的每个子classes 将独立 table。如果您这样做,您可能需要额外的逻辑来处理用户更改个人资料类型(即从专业人士变为精英人士)的情况。
为了将它与 django-allauth 分开,只需完成注册(创建一个表单并在您的设置中定义 ACCOUNT_SIGNUP_FORM_CLASS 以使用您的基本信息覆盖所有授权默认值 + 选择一个配置文件类型表单)和一旦您的用户登录,将他们重定向到他们的个人资料以完成该过程。