當用戶登錄時,他/她應該只能看到由相應用戶創建的對象。根據用戶在django中過濾內容
如何在django中實現這個功能?
當我從數據庫訪問對象時,我是否也根據用戶請求對這些對象執行過濾,或者有沒有這樣做的方法?
當用戶登錄時,他/她應該只能看到由相應用戶創建的對象。根據用戶在django中過濾內容
如何在django中實現這個功能?
當我從數據庫訪問對象時,我是否也根據用戶請求對這些對象執行過濾,或者有沒有這樣做的方法?
這是一個常見要求 - 我寫了一篇關於該文章的博客文章: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將只有機會獲得屬於當前用戶對象。
如果你想允許用戶只能看到他們創造的物品,這裏有一個簡單的例子,可以實現這樣的行爲:
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})
正如我寫的,這是隻是一個非常簡單的例子,讓你知道如何開始。你必須適應並進一步擴展它。
好吧,所以猜對了,你過濾基本的條件........想到了,是否有任何內置的django類或函數....無論如何感謝承擔痛苦舉個例子 – dreamer
相應的用戶是什麼意思?如果我理解你的問題,你可以使用組。用戶可以看到來自同一組的其他用戶創建的對象。 – cezar
用戶應該只能查看他創建的項目---就是我的意思 – dreamer