2013-12-16 69 views
0

我有這些做工精細的意見如下:Django的ClassView中繼承

class FriendView(View): 

    message_success = None 
    message_error = None 

    def get_pending_received(self): 
     return models.FriendRequest.objects.filter(recipient_user_id=self.request.user.id) 

    def get_existing_friends(self): 
     return models.Friendship.objects.filter(source_user_id=self.request.user.id) 

    def get_pending_sent(self): 
     return models.FriendRequest.objects.filter(sender_user_id=self.request.user.id) 

    def get(self, request): 
     return render(request, 'template/friends.html', 
         {'pending_received_requests': self.get_pending_received(), 
         'existing_friends': self.get_existing_friends(), 
         'pending_sent_requests': self.get_pending_sent(), 
         'message_success': self.message_success, 
         'message_error': self.message_error}) 



class DeleteFriendView(FriendView): 



    def get(self, request, friendship_id): 
     try: 
      friendship = models.Friendship.objects.get(id=friendship_id) 
     except models.Friendship.DoesNotExist: 
      raise Http404 

     if not ((friendship.source_user_id == request.user.id) or (friendship.dest_user_id == request.user.id)): 
      return HttpResponseForbidden("Forbidden") 

     friendship.delete() 

     message_success = "Friend has been deleted" 

     return render(request, 'template/friends.html', 
         {'pending_received_requests': self.get_pending_received(), 
         'existing_friends': self.get_existing_friends(), 
         'pending_sent_requests': self.get_pending_sent(), 
         'message_success': 'Friend has been Deleted'}) 

我的問題是,有沒有把邏輯是GET之前執行DeleteFriendView的方式()沒有覆蓋的get() ?這將更清潔,並會減少重複的代碼,但在閱讀ClassView文檔後,我似乎無法找出最佳方式來做到這一點,因爲我無法在類視圖的方法之外訪問自我?

我會想象這樣的事情:

class DeleteFriendView(FriendView): 
    def before_get(self): 
     try: 
      friendship = models.Friendship.objects.get(id=friendship_id) 
     except models.Friendship.DoesNotExist: 
      raise Http404 

     if not ((friendship.source_user_id == request.user.id) or (friendship.dest_user_id == request.user.id)): 
      return HttpResponseForbidden("Forbidden") 

     friendship.delete() 

     self.message_success = "Friend has been deleted" 

這樣的get()方法可以重複使用。

謝謝, 馬克

回答

2

爲什麼你不希望覆蓋get()?你可以把你的邏輯放在那裏,然後簡單地調用超類方法。

class DeleteFriendView(FriendView): 
    def get(self, request): 
     # delete-specific logic here 

     # now call FriendView get() 
     return super(DeleteFriendView, self).get(request) 

請注意,在GET請求中放置數據修改操作的做法很差。它們很容易被意外觸發或通過惡意鏈接觸發。您應該始終在POST請求中添加諸如刪除之類的內容。

+0

謝謝丹尼爾。那麼創建帶有隱藏值的表單來做這樣的動作會更好嗎? –