2013-12-16 4 views
0

I가 잘 작동되는 다음보기 :장고 클래스 뷰 상속

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'}) 

내 질문입니다하기 전에 실행되는 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" 

이 방법 :

나는 이런 식으로 뭔가를 상상한다.

덕분에, 마크

답변

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

감사합니다. Daniel. 다음과 같은 작업을 수행하기 위해 숨겨진 값으로 양식을 만드는 것이 더 나은가? –