我使用Python 3.6和Django的1.11Django的身份驗證 - 只過濾用戶創建的(不是全部)記錄查看
我有一個工作程序(用於學習目的)對用戶進行認證,然後允許用戶創建基於模型的Django表單中的「事物」。在這種情況下,用戶可以「跳槽」的東西,比如吸菸或飲酒,並指定其退出日期,等的主頁當前顯示的所有用戶創建的所有「東西」的清單。世界上任何人都可以看到這些。
我想要做的是限制這個視圖,以便1)唯一認證的用戶可以查看數據庫中的「東西」,和2)通過認證的用戶只能查看自己的「東西」。
我怎麼想這將實現在app/views.py文件開始。 Cuurently,主頁視圖(所有的事情的清單)看起來像這樣:
def something_list(request):
things = Thing.objects.filter(quit_date__lte=timezone.now()).order_by('quit_date')
return render(request, 'quit/something_list.html', {'things': things})
這定義了一個查看它通過訂單「戒菸日」,並將其發送給我的「東西列表」模板。
通過在線搜索,似乎可以通過將參數添加到Thing.objects.filter()來指定僅查看用戶的數據。迄今爲止,我已經試過各種原因造成的錯誤,包括這個:
things = Thing.objects.filter(owner=request.user).filter(...)
這
things = Thing.objects.filter(owner=request.user, quit_date__lte=timezone.now()).order_by('quit_date')
這裏是我的模型,只是讓你知道字段名稱:
class Thing(models.Model):
quitter = models.ForeignKey('auth.User')
title = models.CharField(max_length=200)
quit_date = models.DateTimeField(default=timezone.now)
cost_per_day = models.DecimalField(max_digits=6, decimal_places=2)
notes = models.TextField()
一旦再次,我試圖找出如何修改我的觀點(上圖),使身份驗證的用戶只能看到「東西」,他們已經建立。另外,我希望未經授權的用戶看到「事物」中的任何一個。希望兩者都可以用同一行代碼完成。
在此先感謝。我是初學者。請讓我知道如果需要更多信息的答案。
更新:(解決方案) 以下他人提供的解決方案是正確的。這裏是適用於我的代碼行:
things = Thing.objects.filter(quitter=request.user).filter(quit_date__lte=timezone.now()).order_by('quit_date')
當我做出這個改變時,我得到了一個'AnonymousUser'對象錯誤。我需要爲未認證的用戶整理我的默認視圖。如果用戶登錄,他們現在只能看到自己的數據,但如果一個匿名用戶瀏覽此頁,他們得到了一個錯誤。我添加了一個「如果,否則」有條件要上我的觀點來處理這個問題。現在它似乎在工作,我想我會分享我的整個看法,以防它可能幫助某人。
def something_list(request):
if request.user.is_authenticated:
things = Thing.objects.filter(quitter=request.user).filter(quit_date__lte=timezone.now()).order_by('quit_date')
return render(request, 'quit/something_list.html', {'things': things})
else:
return render(request, 'quit/base.html')
您列出的任何一個'filter'嘗試都應該這樣做,可能的修正是您的示例代碼指的是'quitter',而您的示例過濾器指的是'owner'。如果這不僅僅是在轉錄代碼時引入的錯誤,那就是問題所在。 –
至於限制未經授權用戶的訪問權限,我通常會將我的應用程序設置爲重定向至登錄頁面(如果未獲得授權),如文檔中所述:https://docs.djangoproject.com/en/1.11/topics/auth/default /#限制訪問登錄用戶但如果不是,'if request.user.is_authenticated:' –
感謝您的協助。這是問題。我上面有詳細的更新。 –