为什么在重写Django中的dispatch()时不会调用get_context_data()?

时间:2014-07-15 13:39:46

标签: django

我覆盖了dispatch()为我的PayPal IPN返回200 OK,但get_context_data()永远不会被调用。知道为什么吗?

class IPN(TemplateView):
    def dispatch(self, *args, **kwargs):
            logger.debug("dispatching now")
            return HttpResponse('<h1>Page was found</h1>')

    def get_context_data(self, **kwargs):
        #verify ipn and create user account

谢谢!

4 个答案:

答案 0 :(得分:2)

原始dispatch决定应该调用视图实现的HTTP方法 - 例如方法get ..

在大多数GenericView中,get方法(例如)调用get_context_data ..

如果您已重写调度以不调用正确的HTTP方法,那么它将不会被调用。

== edit ==

现在您已经发布了代码,我们可以看到您没有调用get方法或视图实现的任何其他HTTP方法。您刚刚返回了回复,因此您从未调用过get_context_data

答案 1 :(得分:2)

你可以打电话

super(IPN, self).dispatch(*args, **kwargs)
如果您希望在dispatch中运行某些代码,请在dispatch

。如果不是这种情况,您应该在视图中覆盖get方法,系统会自动调用get_context_data

答案 2 :(得分:1)

正如您之前所说,dispatch而非get_context_data都不是覆盖此处的正确方法。 dispatch实际上只是要确定是要拨打get还是post:您应该覆盖其中一个或两个。 get_context_data用于提供渲染模板的上下文数据:如果您没有渲染模板,则不应该覆盖该方法。

答案 3 :(得分:1)

我认为你并不清楚django CBV是如何工作的(例如TemplateView),如果你刚开始使用它们,不要担心它有点复杂。

阅读本文http://www.gregaker.net/2012/apr/19/how-do-django-class-based-views-work/

dispatch()方法和描述如何在TemplateView中互连之前,它会非常深入。

请花10分钟阅读,这将真正有所帮助,您将自己理解,您在代码中缺少什么。 :)