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 には 2 つの解決策があります。1 つは 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

私はあなたの質問を次の意味として解釈しています。

クラスベースのビューを使用する場合-フォームの特定のインスタンスが特定のユーザーによって編集可能かどうかを制御する方法があります。モデルのレコード#1があります。ユーザーXとしてログインすると、レコード#1を編集できますが、ユーザーYはレコード#1を編集できません。

これがあなたが話していることである場合、行/オブジェクトレベルの権限が必要になります。これは、django-guardianを使用する場合に最適であることがわかりました。

具体的には、クラスベースのビューを使用する場合は、PermissionRequiredMixinを使用できます。これは次の場所にあります:http://packages.python.org/django-guardian/api/guardian.mixins.html#permissionrequiredmixin

ユーザーXとユーザーYがそのフォームの任意のインスタンスを編集できるかどうかを制御するだけを探している場合。すなわち。ユーザーXはフォームAの値を編集できます。次に、権限を適切に管理し、ユーザーがビューでその権限を持っているかどうかを確認する必要があります。

JD

于 2012-10-17T21:26:35.857 に答える
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 に答える