2015-09-02 22 views
0

當用戶登錄時,他/她應該只能看到由相應用戶創建的對象。根據用戶在django中過濾內容

如何在django中實現這個功能?

當我從數據庫訪問對象時,我是否也根據用戶請求對這些對象執行過濾,或者有沒有這樣做的方法?

+0

相應的用戶是什麼意思?如果我理解你的問題,你可以使用組。用戶可以看到來自同一組的其他用戶創建的對象。 – cezar

+0

用戶應該只能查看他創建的項目---就是我的意思 – dreamer

回答

1

這是一個常見要求 - 我寫了一篇關於該文章的博客文章:http://spapas.github.io/2013/11/05/django-authoritiy-data/而不是用戶有權訪問其對象,用戶可以訪問其「權限」對象(即屬於同一用戶的用戶組部門,公司等)。

在任何情況下,對於您需要僅由創建它們的用戶可見/可編輯的所有模型,您需要添加一個名爲created_by的外鍵字段與創建該模型對象的用戶,如: created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)

之後,創建對象時,您將不得不用當前用戶更新該字段。舉例來說,如果你使用CBVS您可以使用下面的混入,以填補created_by場(從另一篇博客中採取我已經寫了有關審計的模型@http://spapas.github.io/2015/01/21/django-model-auditing/):

 
    class AuditableMixin(object,): 
    def form_valid(self, form,): 
     if not form.instance.created_by: 
      form.instance.created_by = self.request.user 

     return super(AuditableMixin, self).form_valid(form) 

之後,當顯示/更新其他對象的列表(通過ListView,UpdateView,DetailView),您可以重寫get_queryset方法,以便它僅過濾與當前用戶類似創建的結果。事情是這樣的:

 
    class OnlyMineMixin(object,): 
    def get_queryset(self): 
     qs = super(OnlyMineMixin, self).get_queryset() 
     return qs.filter(created_by=self.request.user) 

現在使用這個mixin的所有CBVS將有機會獲得屬於當前用戶對象。

+0

正在尋找類似的東西。 。 。 。會嘗試一下並回復給你。謝謝 。 。 。 – dreamer

+0

是的,這工作...,。謝謝 – dreamer

0

如果你想允許用戶只能看到他們創造的物品,這裏有一個簡單的例子,可以實現這樣的行爲:

views.py

from django.contrib.auth.models import User 
from django.shortcuts import get_object_or_404, redirect, render 

def show_items(request, username): 
    user = get_object_or_404(User, username=username) 
    if request.user == user: 
     # get the items for the user, assuming there is a model item 
     items = user.items.all() 
    else: 
     # redirect the user to the login page or whatever you want 
     return redirect('login.html') 
    return render(request, 'items.html', {items: items}) 

正如我寫的,這是隻是一個非常簡單的例子,讓你知道如何開始。你必須適應並進一步擴展它。

+0

好吧,所以猜對了,你過濾基本的條件........想到了,是否有任何內置的django類或函數....無論如何感謝承擔痛苦舉個例子 – dreamer