在my Django应用程序中实现用户类型限制

在my Django应用程序中实现用户类型限制,django,django-models,django-forms,django-admin,django-users,Django,Django Models,Django Forms,Django Admin,Django Users,我一直在两个关于创建自定义用户模型的教程之间来回切换: 及 到目前为止,我的代码如下: 型号: class CustomUser(AbstractUser): is_admin = models.BooleanField('admin status', default=False) is_areamanager = models.BooleanField('areamanager status', default=False) is_sitemanager = mode

我一直在两个关于创建自定义用户模型的教程之间来回切换:

到目前为止,我的代码如下:

型号:

class CustomUser(AbstractUser):
    is_admin = models.BooleanField('admin status', default=False)
    is_areamanager = models.BooleanField('areamanager status', default=False)
    is_sitemanager = models.BooleanField('sitemanager status', default=False)
表格:

管理员:

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username',]

admin.site.register(CustomUser, CustomUserAdmin)
我在这一点上碰到了一堵墙。我不确定将内容限制在用户身上的方向。我的总体想法是,我希望管理员能够访问所有内容,区域经理拥有下一级访问权限,站点经理拥有下一级访问权限,然后普通用户(所有布尔检查都为false)拥有基本权限


这是实现这种方法的最佳途径吗?我应该从这里走到哪里?为什么?

不要扩展AbstractUser、user Django内置组和权限来创建具有不同权限的用户类:

如果需要向用户添加更多信息,常用模式是创建用户配置文件:

class UserProfile(models.Model):  
    user = models.OneToOneField(User, related_name='profile')
    address = models.CharField(max_length=140)  
    age = ...
有几点建议:

  • 仅在特定用例中使用AbstractUser(例如,当您需要自定义AuthenticationBackend时)
  • 在模型中使用用户ID而不是用户配置文件ID作为FK(从请求中检索它更容易)
  • 对于基本用例,只需在UserProfile中添加一个“role”字段就足以实现一个简单的逻辑

谢谢您的回答。您能否进一步介绍使用内置组功能?例如,如果我有一个包含3部分信息的模板页面,我只希望管理员访问3部分中的2部分,而其他人只访问1部分。如果我像上面那样将用户设置为admin/user/manager组,我将如何限制它们?如果只有admin/not admin组,我建议使用内置的“is_staff”属性。您可以为您的管理员用户将其设置为True(注意:工作人员可以访问管理员面板),然后隐藏模板中的按钮:{%if request.user.is_admin%}12{%endif%}3我想我将有4个组。或者可能是3(管理员、站点管理员、区域管理员),默认状态为普通用户。在这种情况下,此实现可以工作吗?在这种情况下,您可以使用组和权限。它们帮助您限制对特定模型的访问,以及用户如何添加/查看/更新/删除这些模型。在这篇文章中,你有一些关于如何在模板中使用这些规则的好例子:希望这会有帮助:)谢谢!这真的很有帮助。
class UserProfile(models.Model):  
    user = models.OneToOneField(User, related_name='profile')
    address = models.CharField(max_length=140)  
    age = ...