【问题标题】:how to create 2 level admin users in django where each user will administer only the users he creates?如何在 django 中创建 2 级管理员用户,每个用户将只管理他创建的用户?
【发布时间】:2020-02-26 17:32:43
【问题描述】:

我需要创建超过 1 个管理员用户,他们只能管理他在 django 中创建的用户的角色/权限。这个管理员应该只能看到他创建的用户,而不是其他用户创建的用户。简而言之,我希望将 django 用作我的客户的 SaaS 模型,他只能在其中管理他的员工/用户。这是否可能以及如何实现?例如。管理员 A 可以为其公司 A 创建用户并为其设置角色,管理员 B 可以为其公司 B 创建用户并设置其角色。但同时管理员 A 不应该看到管理员 B 创建的用户,反之亦然。

【问题讨论】:

  • 是的,有可能。不过,您不会想要为此使用 Django 管理面板。您应该为这些用户编写自定义“管理”区域。
  • @SamCreamer 您能否大致说明如何为此目的定义用户类?
  • 这里只是一个建议,也许你应该把这个问题想得更笼统,比如多租户。然后每个公司可以有多个管理员,但他们只能访问他们公司的用户。在这种情况下,将 User 模型链接到 Company 模型,然后在管理页面中根据管理员的公司过滤掉用户。
  • @GabrielMuj 就是这样,但是 1 家公司的管理员在登录管理面板时应该看不到另一家公司的用户

标签: django python-3.x


【解决方案1】:

步骤 1。 django-admin startproject twoadminproject

第 2 步。 cd twoadminproject

第 3 步。 python manage.py startapp twoadminapp

第 4 步。更改“twoadminapp”应用的models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    created_by = models.CharField(max_length=30, blank=True, null=True)

第 5 步。更改设置.py:

# Add you app in INSTALLED_APPS list

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'twoadminapp',
]

# Add one line at the end

AUTH_USER_MODEL = 'twoadminapp.User'

第 6 步。 python manage.py makemigrations

第 7 步。 python manage.py migrate

第 8 步。 python manage.py createsuperuser(执行此命令两次,创建两个管理员用户)

第 9 步。更改“twoadminapp”应用的 admin.py:

from django.contrib import admin
from .models import User

# Register your models here.


class UserAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        users = super(UserAdmin, self).get_queryset(request)
        return users.filter(created_by=request.user.username)


admin.site.register(User, UserAdmin)

因此,每当您从管理面板添加用户时,您必须在“添加用户表单”的创建字段中填写管理员用户名,或者您可以在 forms.py 中对其进行初始化

【讨论】:

  • 这肯定会创建 2 个管理员用户。但我想创建一个用户层次结构,每个用户管理他创建的用户。其他人创建的用户对其同行不可见。
  • 您应该将created_by 更改为ForeignKey-关系到self,以便使用User 而不是用户名(例如,如果您交换用户名怎么办?)。接下来,您仍然需要覆盖/实现UserAdmin.has_change_permission() 以检查用户是否是由当前查看的用户创建的。否则,您可以通过简单地重写 url 来更改其他用户。
猜你喜欢
  • 2019-06-30
  • 2011-03-30
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2020-07-13
相关资源
最近更新 更多