[英]How to create Workspaces and manage them for all the users in Django?
我的 Django 應用程序中有一個完整的登錄和注冊系統,它可以讓我注冊用戶、登錄用戶、注銷用戶、更改密碼、重置密碼、邀請用戶。 我擁有所有基本功能。
根據以下幾點,我現在希望為用戶提供工作區:
我該如何做到這一點? 你可以說這類似於 Slack 的事情。 我只需要一個指導方針/路線圖,我會自己實施。
我已經創建了一個Workspace
模型,如下所示:
class Workspace(models.Model):
name = models.CharField(max_length=254)
created_at = models.DateTimeField(auto_now_add=True)
def make_admin(self, user):
user.is_workspace_admin = True
user.save()
def remove_admin(self, user):
user.is_workspace_admin = False
user.save()
並且我的User
模型在其他默認 Django 字段旁邊具有以下兩個屬性:
class User(AbstractBaseUser, PermissionsMixin):
is_workspace_admin = models.BooleanField(default=True)
workspaces = models.ManyToManyField(Workspace)
這種方法正確嗎? 如果沒有,請指導我正確的方式。 順便說一句,使用這種方法,我可以向任何用戶添加/分配工作區,但是我將如何管理登錄到他們自己的工作區並僅對他們已分配到的工作區做出反應的用戶。 還有工作區管理員控制其工作區的用戶等?
我知道使用組。 因此,假設我創建了所有相關權限(您還可以告訴我如何創建權限嗎?)以添加工作區用戶、刪除工作區用戶、使工作區用戶成為工作區管理員、從工作區管理員中刪除工作區管理員等,並創建不同的組並添加每個組的相關權限。 假設我的組看起來像manage_workspace_a
來管理(添加/刪除)工作區用戶組, manage_workspace_admins
來管理(添加/刪除)工作區管理員,以及 Django 為每個模型提供的默認權限。
那么,我將如何擁有這樣的功能:當具有is_superuser=True
的"User A"
使is_workspace_admin=True
成為"User B"
時, "User B"
應該自動獲得所有工作區管理員權限。 像這樣的東西:
workspace_user = User.objects.get(email="some-email-address")
if request.user.is_superuser:
wordspace_user.permissions.add([Workspace Admin Permissions])
有人可以用一個小代碼示例來解釋整個過程嗎?
這是一個很長的多部分問題,但希望我可以為您指明正確的方向
我建議在處理管理員狀態的用戶模型上添加另一個多對多字段。 目前,您已將其設置為布爾標志 - 因此管理員可以管理所有工作區或不管理任何工作區。
就個人而言,我會顛倒 M2M 的狀態,將users
和administrators
放在工作空間上,而不是放在用戶模型上。 擁有用戶模型沒有問題,但我覺得檢查用戶是否在工作區的允許用戶/管理員中而不是工作區是否在用戶的工作區和管理工作區列表中更有意義。
您將需要更改將管理員添加到工作區的代碼,因為您不想使用布爾標志:
def make_admin(self, user): self.administrators.add(user)
至於如何管理工作區本身,您可以將 ORM 過濾器放在相關視圖的開頭:
def workspace_view(request, workspace_id): workspace = get_object_or_404(Workspace, workspace_id) if request.user not in workspace.users: return redirect(...) ...the rest of your view
請記住,除非管理員在users
組中,否則這不允許管理員進入 - 您需要將他們添加到users
或添加另一個條件以檢查他們是否在administrators
中。
如果您想了解某種索引/主頁中所有工作區的概覽,您只需使用 m2m 反向訪問器,它取決於您的反向名稱(或/relation/_set
默認情況下):
def workspaces(request): workspaces = request.user.workspaces.all()
您絕對可以利用 Django 的內置權限系統,我會向您指出文檔,因為這是一個很長的主題:
https://docs.djangoproject.com/en/4.0/topics/auth/default/#permissions-and-authorization
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.