为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2021-08-05 10:26:25
我有一个 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'),视图.pyclass ToDoListItemDetail(DetailView):    model = ToDoListItemtodolistitem_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 中)???(还有比上面更好的东西,我还不知道)有没有办法限制用户在整个应用程序中只能看到他们自己的数据,而无需在每次需要时实现此逻辑?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

可以过滤在DetailView为好,通过重写get_queryset方法[Django的DOC] :


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]然后将使用idand/or进一步过滤它slug,但是如果您已经过滤掉了不属于 的元素self.request.user,那么这只会导致查询不返回任何结果。


在这里将LoginRequiredMixin[Django-doc]添加到您的类中也是有意义的,因为如果用户没有登录,您可能希望将下摆/她重定向到登录屏幕。


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号