0

こんにちは、私は働いているビューがあります。私はこれが最良かそれとも良い方法かを知りたがっています。私は写真のオブジェクトを削除する削除ビューを持っているが、ログインしているユーザーがオブジェクトに関連付けられているオンの場合にのみ、あなたはモデルや、そのような、それをリクエストしてくださいなどの詳細情報が必要な場合はDjango - パーミッションとDeleteViewはこれを行う良い方法ですか?

は、ここに私のviews.py

class PhotoDelete(DeleteView): 
    model = Photo 
    template_name = 'otologue/photo_delete.html' 
    success_url = reverse_lazy('otologue:photos') 

    def get(self, request, *args, **kwargs): 
     object_instance = self.get_object() # Get the object 
     object_user = object_instance.photoextended.user # Get the user who owns the object 

     user = get_object_or_404(User, username=self.request.user) # Get the user in the view 
     if object_user != user: # See if the object_user is the same as the user 
      return HttpResponseForbidden('Permission Error') 
     else: 
      return render(request, self.template_name, {'object': object_instance}) 

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

です。

答えて

0
  • self.request.userが既にユーザーのインスタンスが含まれているのであなたは、get_object_or_404()を呼び出す必要はありませんので、あなたはそれを直接比較することができます。

  • テンプレートを自分でレンダリングする代わりに、DeleteViewのget()メソッドを呼び出して結果を返す必要があります。

  • あなたのdispatch()がスーパーのメソッドを呼び出すことと別に何もしないので、デコレータの代わりにLoginRequiredMixinも使用します。

  • 実際の削除はpost()メソッドで行われることに注意してください。ユーザーチェックをdispatch()メソッドに移動する必要があります。そうしないと、偽造POSTリクエストでチェックをバイパスすることができます。

は、DeleteViewはその方法で何をするかより良いアイデアを持って確認するには、それは( ccbv.co.ukで例えば)ソースコード付き

+0

だ 'DeleteView'私は' LoginRequiredMixin'を使用して上の問題があります。他のビューでは動作していますが、DeleteViewの場合は、とにかく 'dispatch'を実行します(POSTとGETで)。 –

関連する問題