0

我有这个页面:8000/edit/6/,它显示了一个更新令人兴奋的模型的表单,我以 X 身份登录,如果我以 Y 身份登录并尝试打开该页面,我可以看到它并更新。所以这无疑是一个大错误和危险。

这是我的查看代码

class VideoUpdate(UpdateView):
   form_class = VideoForm
   model = Video
   template_name = 'videos/video_update.html'

   @method_decorator(login_required)
   def dispatch(self, *args, **kwargs):
      return super(VideoUpdate, self).dispatch(*args, **kwargs)

   def form_valid(self, form):
      messages.info(self.request, _('Event is updated successfully'))
      return super(VideoUpdate, self).form_valid(form)

有没有办法用用户 ID 检查模型对象 ID。新手的一个简单问题

解决方案:

实际上,views.py 中有两种对我有用的解决方案,一种是使用 get_queryset 方法

def get_queryset(self):
    base_qs = super(VideoUpdate, self).get_queryset()
    return base_qs.filter(user=self.request.user.get_profile)

或使用 get_object 方法

def get_object(self):
    video = get_object_or_404(Video, pk=self.kwargs['pk'])
    if video.user != self.request.user.get_profile():
        raise Http404
    return video
4

2 回答 2

0

您的问题对我来说并不完全清楚,但我认为您想限制注册但未经授权的用户查看。通常,这可以在您的视图而不是模型中更好地实现:

# views.py

def edit_form(request, parameter_indicating_user):
  user = request.user

  if #some logic:
    # if user is equal to the user indicated by some parameter 
    # (id, username, etc) then allow that view to be rendered
  else:
    raise Http404 # or redirect the unauthorized user
于 2012-10-17T20:53:40.540 回答
0

我将您的问题解释为以下含义。

当使用基于类的视图时 - 有没有办法控制表单的特定实例是否可由给定用户编辑,即。我们有一个模型的记录#1。当您以用户 X 身份登录时,您可以编辑记录 #1,但不允许用户 Y 编辑记录 #1。

如果这就是您所说的,您将需要行/对象级别的权限,我发现这在使用 django-guardian 时是最好的。

具体来说,当使用基于类的视图时,您可以使用 PermissionRequiredMixin,可以在这里找到:http ://packages.python.org/django-guardian/api/guardian.mixins.html#permissionrequiredmixin

如果您只想控制用户 X 与用户 Y 是否可以编辑该表单的任何实例。IE。用户 X 可以编辑表单 A 值。然后您只需要适当地管理权限,然后检查用户是否在视图中具有该权限。

京东

于 2012-10-17T21:26:35.857 回答