2015-08-22 71 views
1

我正在使用User Authentication構建一個簡單的應用程序。編輯模型實例時限制用戶權限的最佳做法

我的應用程序有3種型號:

  • 用戶:標準的Django用戶模型
  • 位置:一種用於辦公模式(地址,網站名稱等)
  • 員工:員工模特(姓名,郵箱等)

我也有一系列的視圖,允許用戶登錄,創建和編輯位置/網站等。

我想知道的是,最好的做法是限制模型實例編輯爲那些用戶創建了?例如。沒有修改,兩個用戶可以創建數據,兩個用戶都可以編輯其他數據。我如何限制這個編輯自己的?

我知道很長的表單方法是在每個模型上放置一個ForeignKey(User),以限制視圖爲queryset,但這看起來冗長而繁瑣。是否有我缺少的Django技巧?也許是裝飾者?

最佳做法是什麼?

+0

如果用戶只能編輯自己的對象,IanAuld的答案是要走的路。否則,您可能有一組可以編輯所有對象的用戶,您可以通過將這些用戶放在一個組中來控制這一點。 – henrikstroem

回答

4

最簡單的方法是編輯模型,使其具有owneruser字段,該字段對創建者是ForeignKey

class Locations(models.Model): 
    owner = ForeignKey(User) 
    ... 

而在你的觀點:

def edit_location(request, location_id): 
    location = Locations.objects.get(pk=location_id) 
    if request.user is not location.owner: 
     # return a 401 or redirect to somewhere 
    else: 
     # do stuff 

您可以使用Django的ManyToManyField選項,如果每個LocationUser可以有多個關係。例如:

class Locations(models.Model): 
    owners = models.ManyToManyField(User) 

user = User.objects.create(username='Ian') 
location = Locations.objects.create(...) 
location.owners.add(user) 

然後是User/Locations上都可用:

>>> location.owners.all() 
[<User: Ian>] 
>>> user.locations_set.all() 
[<Locations: ...>] 

User該集將被自動創建,它將被命名爲<Model Name>_set

然後,您可以使用in運營商檢查所有權:

def edit_location(request, location_id): 
     location = Locations.objects.get(pk=location_id) 
     if request.user in location.owners.all(): 
      # return a 401 or redirect to somewhere 
     else: 
      # do stuff 
+0

謝謝。假設我想擴展它,以便2個用戶可以編輯相同的數據。然後一個外鍵將不起作用(因爲這是1-1)。有任何想法嗎? – alias51

+0

'ManyToManyField'應該工作,假設每個'User'可以有很多'Locations',每個'Location'可以有很多'User' – IanAuld

相關問題