为什么让对象两次?

时间:2015-12-26 13:35:56

标签: django django-class-based-views

此代码来自此处(http://gswd-a-crash-course-pycon-2014.readthedocs.org/en/latest/talksmodel.html)。 。在TalkListRemoveTalkView中,他重写get_object并获取特定的Talk。然后他重写get方法,并再次检索该对象。 。

我的问题是,如果他在get_object方法中获取了我们需要的对象,为什么我们需要再次在get方法中调用get_object?

大声思考,get方法是否从Talk和TalkList的URL中提取kwargs,然后将它们传递给查询的get_object方法?或者我完全错了?提前谢谢。

class TalkListRemoveTalkView(views.LoginRequiredView, RedirectView):
    model = Talk

    def get_redirect_url(self, *args, **kwargs):
        return self.talklist.get_absolute_url()

    def get_object(self, pk, talklist_pk):
        try:
            talk = self.model.objects.get(
                pk=pk,
                talk_list_id=talklist_pk,
                talk_list__user=self.request.user
            )
        except Talk.DoesNotExist:
            raise Http404
        else:
            return talk

    def get(self, request, *args, **kwargs):
        self.object = self.get_object(kwargs.get('pk'),
                                      kwargs.get('talklist_pk'))
        self.talklist = self.object.talk_list
        self.object.delete()
        return super(TalkListRemoveTalkView, self).get(request, *args, **kwargs)

1 个答案:

答案 0 :(得分:1)

他没有做两次。 get_object方法中对get的调用是该方法被调用的唯一时间。在该调用之外没有对它的引用,并且该视图不会继承任何其他在其他地方调用它的视图。

请注意,此代码因其他原因而不好;特别是,你必须永远不要像GET调用中的删除那样执行破坏性操作,这些操作应始终在POST上完成。