我有一个Web应用程序,用户在其中登录并开始输入create index idx3 on t3(time, id1, id2, name);
的项目。 ToDoList
包含在base.html
中,因此用户在登录之前无法在应用程序中看到任何内容。我正在使用以下方法进行测试:
is_authenticated
登录User2
ToDoListItem
DetailView
在这一点上,我意识到只要将现有的http://localhost:8000/to_do_list/to_do_item/72
输入以下内容即可,User2
允许ToDoListItem
看到User1
的任何pk
的详细信息:{{ 1}}。
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
并在那里检查用户所有权(类似于No.1,但在DetailView中)是否有一种方法可以限制用户在整个应用程序中仅查看自己的数据,而无需在每次需要时都执行此逻辑?
答案 0 :(得分:1)
您也可以通过覆盖get_queryset
method [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)
中进行过滤:
get_queryset(..)
Django将在幕后始终致电model
。默认情况下,此函数返回您为所有对象指定的id
的查询集。但您因此可以将其进一步过滤。
Django的get_object
method [Django-doc]随后将使用slug
和/或self.request.user
对其进行进一步过滤,但是如果您已经过滤掉了不属于{{1}}的元素, ,那么这只会导致查询不返回任何结果。
在这里将LoginRequiredMixin
[Django-doc]添加到您的班级也很有意义,因为如果用户未登录,您可能希望将hem / her重定向到登录屏幕。
答案 1 :(得分:0)
有一个名为:“可以读取”的权限,该权限允许您处理访问。例如:
class FruitEdit(PermissionRequiredMixin,DetailView):
permission_required = 'app.read_fruit'
...
我希望你能解决