Django基于类的视图功能执行顺序

时间:2013-07-21 02:15:55

标签: django django-class-based-views

我正在将一些django视图转换为基于类的视图,并且到目前为止都非常喜欢这种灵活性。

我的大多数视图都是从父视图ClubView继承的。需要处理post()方法覆盖的每个子类视图都需要访问相应的club值。

此值位于URL中,因此请求变量具有该值。但是,有没有办法让我抓住这个值,并在post()方法之外获取相应的俱乐部对象?比如pre-post()方法或其他东西。主要是因为我不想复制/粘贴club = Club.objects.get(...

更一般的问题 - 所有方法的执行顺序是什么?关于Django的文档似乎缺乏。

4 个答案:

答案 0 :(得分:2)

dispatchpost之前调用 - 或者就此而言get,具体取决于请求。覆盖它应该让你设置额外的信息。

文档缺乏细节 - 在我阅读源代码之前我没有真正理解。但是除了分布在多个文件之外,源代码的可读性很好。

答案 1 :(得分:2)

实际上,你真的是颠倒了。而不是中心ClubView,为每个单独的操作/页面设置一个视图类更灵活。例如,你可能会有这样的事情:

class ClubListView(ListView):
    model = Club

class ClubDetailView(DetailView)
    model = Club

# etc...

这样,您只需要通过在视图类上定义一个特定的方法来覆盖每个操作所特有的特定功能,这些方法可以满足您的需要。例如。您需要根据请求中的内容动态过滤ClubListView中可能的俱乐部吗?只需覆盖ClubListView.get_queryset方法即可应用相应的过滤器。

如果某些特殊行为需要应用于所有视图,则取决于此行为的真正含义:如果它与此特定模型相关,则应该最好在模仿本身,或者也许是它的经理;如果它真的是视图特有的东西,你应该编写并扩展mixin和实际的视图类。

答案 2 :(得分:0)

您可以在父类中编写get_club方法。然后,您可以在子类中使用它,而不必重复逻辑。

答案 3 :(得分:0)

这个DjangoProject page on Generic Display Views似乎是最有用的,imo。

它涵盖了ListView和DetailView,并详细说明了在基于类的显示视图中执行的方法-这是一个名为DetailDetail方法的示例:

setup()
dispatch()
http_method_not_allowed()
get_template_names()
get_slug_field()
get_queryset()
get_object()
get_context_object_name()
get_context_data()
get()
render_to_response()