Django 用户 permissions/views?
Django User permissions/views?
我正在使用基于 Django class 的视图。
views.py
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
如您所见,这些是最通用的视图,但它们都应该只代表当前用户的数据。
目前任何用户都可以see/view其他用户的数据。
我看到的一种方式是人们会像上面那样定义他们的 get_queryset 方法。这种方法只过滤渲染数据,但用户仍然可以通过 url 访问禁止数据(前提是他 knows/guesses id)。
如何限制对其他用户资源的访问?
我已经弄明白了。我创建了一个 Mixin,其中查询集根据用户进行评估。
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 class 的视图。
views.py
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
如您所见,这些是最通用的视图,但它们都应该只代表当前用户的数据。
目前任何用户都可以see/view其他用户的数据。
我看到的一种方式是人们会像上面那样定义他们的 get_queryset 方法。这种方法只过滤渲染数据,但用户仍然可以通过 url 访问禁止数据(前提是他 knows/guesses id)。
如何限制对其他用户资源的访问?
我已经弄明白了。我创建了一个 Mixin,其中查询集根据用户进行评估。
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