我应该在哪里调用django CBV中的自定义方法? (详细视图)

时间:2018-05-03 06:15:15

标签: python django

我制作了一个自定义方法,可以在get()页面中调用DetailView方法时保存会话。

这是我的代码示例。

class CustomDetailView(DetailView):
    model = Jobs
    template_name = "jobs/job_detail.html"
    context_object_name = "job"

    def custom_save_session(self, request):
        # save session and so on
    ...

我想知道我应该在哪里调用custom_save_session方法。 我试图在get()get_context_data()内部调用它,依此类推。

一切都很好,但我有好奇心什么是最好的方法。

  • 我应该在get()方法内打电话吗?原因我希望每次get()调用时保存会话数据。
  • 是否有任何方法在get()中每次调用DetailView时调用自定义方法?

(我也不仅想知道DetailView,还想知道django中的所有CBV

2 个答案:

答案 0 :(得分:1)

每个基于类的视图都有一个运行顺序,每个顺序都有自己的方法。

CBV为每个执行步骤都有专门的方法。

您可以从运行要从中调用自定义方法的步骤的方法调用自定义方法。

因此,您必须决定自定义方法的运行位置,并在此步骤的视图通用方法之上定义您自己的方法。

More from docs

在url中,CBV返回as_view(),这是一个获得reuqest的可调用函数。从这个入口点(实际上是CBV调度方法),CBV运行所有步骤。

答案 1 :(得分:1)

我们可以通过两种方式在类DetailView中调用额外的方法。

  1. 通过覆盖disatch方法
  2. 通过覆盖get方法
  3. 调度方法

    class CustomDetailView(DetailView):
        model = Jobs
        template_name = "jobs/job_detail.html"
        context_object_name = "job"
    
        def custom_save_session(self, request):
            pass
    
        def dispatch(self, request, *args, **kwargs):
            self.custom_save_session(request)
            return super(CustomDetailView, self).dispatch(request, *args, **kwargs)
    

    获取方法

    class CustomDetailView(DetailView):
            model = Jobs
            template_name = "jobs/job_detail.html"
            context_object_name = "job"
    
            def custom_save_session(self, request):
                pass
    
            def get(self, request, *args, **kwargs):
                self.custom_save_session(request)
                return super(CustomDetailView, self).get(request, *args, **kwargs)
    

    以上两种方式都没问题。但是,我会使用dispatch方法,因为我们正在处理会话数据,所以会更好。