Django ClassView inheritance



我有以下视图运行良好:

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()之前执行,而不重写get()?这会更干净,也会减少重复代码,但在阅读了ClassView文档后,我似乎无法找到最好的方法来做到这一点,因为我无法在类视图中的方法之外访问self?

我会想象这样的事情:

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()方法。

谢谢,标记

为什么不想覆盖get()?你可以把你的逻辑放在那里,然后简单地调用超类方法。

class DeleteFriendView(FriendView):
    def get(self, request):
        # delete-specific logic here
        # now call FriendView get()
        return super(DeleteFriendView, self).get(request)

顺便注意,在GET请求中放入数据修改操作是非常糟糕的做法。它们太容易被意外或通过恶意链接触发。您应该始终在POST请求中放入删除之类的内容。

最新更新