模型表单更新页面显示给所有注册用户

时间:2012-10-17 20:43:16

标签: django

我有这个页面: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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我将您的问题解释为以下内容。

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

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

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

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

JD

相关问题