如何防止用户在 Django DetailView 中看到不属于他们的数据?

我有一个 Web 应用程序,用户可以在其中登录并开始输入ToDoList. 在base.html被包装在一个is_authenticated检查,以便用户无法看到任何东西的应用,直到他们已经登录我在做一些测试用:


登录为 User2

添加一个新的 ToDoListItem

重定向到 DetailView

在这种情况下,URL = http://localhost:8000/to_do_list/to_do_item/72

此时我意识到的DetailView将允许User2看到任何细节ToDoListItem的User1只是通过输入现有pk分为:http://localhost:8000/to_do_list/to_do_item/<int:pk>。


urls.py 包括

path('to_do_item/<int:pk>', views.ToDoListItemDetail.as_view(), name='todo-item-detail'),

视图.py

class ToDoListItemDetail(DetailView):

    model = ToDoListItem

todolistitem_detail.html

{% 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 %}

防止这种情况发生的推荐方法是什么?我正在考虑以下几点:


我可以完全删除 DetailView 并定向到仅返回用户数据的不同 URL(使用类似ToDoListItem.objects.filter(user=request.user))

我可以检查登录用户的名称是否与拥有ToDoListItem.

我可以覆盖get_context_data()DetailView 并在那里检查用户所有权(类似于 1,但在 DetailView 中)

???(还有比上面更好的东西,我还不知道)

有没有办法限制用户在整个应用程序中只能看到他们自己的数据,而无需在每次需要时实现此逻辑?


狐的传说
浏览 216回答 2
2回答

qq_遁去的一_1

可以过滤在DetailView为好,通过重写get_queryset方法[Django的DOC] :from django.contrib.auth.mixins import LoginRequiredMixinclass ToDoListItemDetail(LoginRequiredMixin, DetailView):&nbsp; &nbsp; model = ToDoListItem&nbsp; &nbsp; def get_queryset(self, *args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; return super(ToDoListItemDetail, self).get_queryset(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *args, **kwargs&nbsp; &nbsp; &nbsp; &nbsp; ).filter(user=self.request.user)Django 总是会在幕后调用get_queryset(..). 默认情况下,此函数返回model您指定的所有对象的查询集。但是你可以进一步过滤它。Django 的get_object方法 [Django-doc]然后将使用idand/or进一步过滤它slug,但是如果您已经过滤掉了不属于 的元素self.request.user,那么这只会导致查询不返回任何结果。在这里将LoginRequiredMixin[Django-doc]添加到您的类中也是有意义的,因为如果用户没有登录,您可能希望将下摆/她重定向到登录屏幕。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python