[英]How to prevent users from seeing data that does not belong to them in Django DetailView?
我有一個 Web 應用程序,用戶可以在其中ToDoList
並開始為ToDoList
輸入項目。 base.html
包含在is_authenticated
檢查中,因此用戶在登錄之前無法在應用程序中看到任何內容。我正在做一些測試:
User2
身份登錄ToDoListItem
DetailView
http://localhost:8000/to_do_list/to_do_item/72
在這一點上,我意識到 DetailView 將允許User2
查看User1
任何ToDoListItem
的詳細信息,只需將現有的pk
輸入到: http://localhost:8000/to_do_list/to_do_item/<int:pk>
。
path('to_do_item/<int:pk>', views.ToDoListItemDetail.as_view(), name='todo-item-detail'),
class ToDoListItemDetail(DetailView):
model = ToDoListItem
{% extends 'base.html' %}
{% block content %}
<a href="/">Home</a>
<h1>DetailView for 'ToDoListItem' model</h1>
<p>TaskTitle: '{{ object.title }}'</p>
<p>Complete: '{{ object.is_complete }}'</p>
<p>User: '{{ object.user}}'</p>
{% endblock %}
防止這種情況發生的推薦方法是什么? 我正在考慮以下幾點:
ToDoListItem.objects.filter(user=request.user)
)ToDoListItem
的用戶名稱匹配。get_context_data()
並在那里檢查用戶所有權(類似於 1,但在 DetailView 中)有沒有辦法限制用戶在整個應用程序中只能看到他們自己的數據,而無需在每次需要時實現此邏輯?
您也可以通過覆蓋get_queryset
方法 [Django-doc]在DetailView
進行過濾:
from django.contrib.auth.mixins import LoginRequiredMixin
class ToDoListItemDetail(LoginRequiredMixin, DetailView):
model = ToDoListItem
def get_queryset(self, *args, **kwargs):
return super(ToDoListItemDetail, self).get_queryset(
*args, **kwargs
).filter(user=self.request.user)
Django 會在幕后總是調用get_queryset(..)
。 默認情況下,此函數返回您為所有對象指定的model
。 但是你可以進一步過濾它。
Django 的get_object
方法 [Django-doc]然后將使用id
和/或slug
進一步過濾它,但是如果您已經過濾掉不屬於self.request.user
的元素,那么這只會導致查詢沒有返回結果。
在這里將LoginRequiredMixin
[Django-doc] 添加到您的類中也是有意義的,因為如果用戶沒有登錄,您可能希望將下擺/她重定向到登錄屏幕。
有一個名為:“可以讀取”的權限,允許您處理訪問。 例如:
class FruitEdit(PermissionRequiredMixin,DetailView):
permission_required = 'app.read_fruit'
...
我希望你能解決它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.