Python Django用户权限/视图?
我使用的是Django基于类的视图 views.pyPython Django用户权限/视图?,python,django,views,Python,Django,Views,我使用的是Django基于类的视图 views.py class ReportListView(LoginRequiredMixin, ListView): model = Report def get_queryset(self): queryset = Report.objects.filter(user=self.request.user) return queryset class ReportDetailView(LoginRequ
class ReportListView(LoginRequiredMixin, ListView):
model = Report
def get_queryset(self):
queryset = Report.objects.filter(user=self.request.user)
return queryset
class ReportDetailView(LoginRequiredMixin, DetailView):
model = Report
class ReportUpdateView(LoginRequiredMixin, UpdateView):
model = Report
class ReportCreateView(LoginRequiredMixin, CreateView):
model = Report
class ReportDeleteView(DeleteView):
model = Report
如您所见,这些是最通用的视图,但它们都应该只表示当前用户的数据
目前,任何用户都可以查看其他用户的数据
我看到的一种方式是,人们会定义他们的get_queryset方法,如上所述。这种方法只过滤呈现的数据,但用户仍然可以通过url访问被禁止的数据(前提是他知道/猜测id)
如何限制对其他用户资源的访问?我已经找到了答案。我创建了一个Mixin,其中queryset根据用户进行评估
class BaseMixin(object):
def get_queryset(self):
return DnevnaBiljeska.objects.filter(igrac=self.request.user.igrac)
class ReportListView(LoginRequiredMixin, BaseMixin, ListView):
model = Report
这样,我就可以对每个视图单独调用super进行进一步的查询集筛选。在访问任何视图之前,请确保当前用户是所查看实例的所有者
class ReportDetailView(LoginRequiredMixin, DetailView):
model = Report
def get_object(self,queryset=None):
obj = super(Report, self).get_object(queryset=queryset)
if obj.user != self.request.user:
raise Http404
return obj
您必须自己实施访问控制。django如何知道允许哪些用户访问?除了内置的身份验证组和权限之外,还有一些扩展提供这种功能。我想到了Django guardian。在访问任何视图之前,请确保当前用户是所查看实例的所有者使用此vs get_queryset有什么好处?get\u queryset在细节/更新/删除视图上的工作方式与get\u对象完全相同,django会自动引发404。我认为
get\u query\u set()
要处理对象列表,需要确定要显示的对象列表,而get\u对象只需要从db中获取对象。在您的情况下,更新、删除、查看应使用get\u object()