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