Django 中用于 Auth 的多种用户类型
Posted
技术标签:
【中文标题】Django 中用于 Auth 的多种用户类型【英文标题】:Multiple User Types For Auth in Django 【发布时间】:2013-06-01 09:56:48 【问题描述】:我的网站有两种用户类型,客户和专业。还有两个“主要模块”,一个供客户购买东西等(主站点),另一个供专业人员管理操作。对于身份验证,我想要:
一个单一的“登录”表单,用于检测用户是客户还是专业人员,并将她转发到正确的模块(主站点或管理站点)。 两种“注册”表格,一种用于客户,另一种用于专业人士。网站可能会询问用户是想注册为专业人士还是客户,以触发每个案例的正确注册流程。 客户将使用“主站点”,不应被授权使用“管理站点”。 专业人员将使用“管理站点”,但不应被授权登录主站点。 专业人士和客户都注册为用户,并共享共同的字段,例如用户名、电话、电子邮件等...因为 Django 不允许我使用两个模型进行身份验证。我创建了自定义模型子类化 AbstractBaseUser,并将其作为 Client 和 Professional 的基本身份验证类。
class BaseUser(AbstractBaseUser):
...
class Client(BaseUser):
...
class Professional(BaseUser):
...
我还将AUTH_USER_MODEL
设置更改为:
AUTH_USER_MODEL = 'myapp.BaseUser'
我还添加了django-allauth 来管理用户注册和身份验证。但现在我被困住了。我刚开始玩 Django/Python,我不知道如何解决这个问题。
似乎没有官方推荐的方法来做到这一点(Implementing multiple user types with Django 1.5)。我应该坚持子类化方法,还是应该执行docs 中指出的 OnetoOne 关系?
正确设置模型后,我应该如何处理这两个注册表单?是否可以使用 django-allauth 完成此操作,还是我需要手动完成?
据我所知,当注册新用户时,会在 User 表中创建一个新的基本用户。但是由于我将创建用户专业化(客户或专业),我应该如何指定我也想在相应的表中创建客户相关数据或专业相关数据?
我对 Django 很陌生,所以任何建议都会有所帮助
【问题讨论】:
【参考方案1】:我认为最简单的方法是在您的项目中添加 3 个应用程序:您的***应用程序、“专业”应用程序和“客户端”应用程序。在***应用程序中,您真正需要做的就是给用户一个登录表单和 2 个链接,一个用于注册为专业人士,一个用于注册为客户。
在这种情况下,我相信您最容易使用 Django 内置的权限系统,并将每种类型的用户分配到相应的组(例如专业人员和客户)。您可以在视图上使用装饰器以确保只有特定组的成员可以访问该视图(因为每个组有 2 个单独的应用程序,您可以为每个视图中的所有视图添加一个装饰器,或者您可以导入 Django 的授权功能到您的 urls.py 并在那里检查它,虽然这超出了这个答案的范围)。
注册很简单,使用您的 urls.py 文件将想要注册的用户转发到正确的应用程序。一旦你这样做了,你应该能够在每个应用程序上使用 django-allauth 注册,允许你创建 2 种不同类型的用户。确保在注册时,将他们分配给正确的组成员。
至于登录重定向,一旦您收到 POST 数据,我会检查登录的用户类型,并使用它将用户转发到与 Professional 或 Client 应用程序一起使用的正确 URL。您可以查看以下链接,了解登录后重定向用户的想法。
Django - after login, redirect user to his custom page --> mysite.com/username
【讨论】:
谢谢,您为我的项目布局提供了很好的指导。但是,模型呢?您认为创建两个 Professional 和 Client 模型,其中 OneToOnefield 链接回 User 模型可以吗?这样我就可以轻松管理我猜想的两种用户类型...... 这当然是一种选择,除非你想扩大规模,否则它不一定是一个坏选择。另一种选择是在单个用户模型中创建所有字段,并使用模型函数来定义哪些字段适用于不同类型的用户。基本上,不是让您的数据库引擎定义哪些字段不能为空,或限制值或其他任何内容,您可以让 Django 强制执行完整性,并在您可以使用单个条目创建的条目方面获得更多的灵活性模型。 @TitusP 请看看这个问题:***.com/questions/35252375/…以上是关于Django 中用于 Auth 的多种用户类型的主要内容,如果未能解决你的问题,请参考以下文章