9

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

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

这个值在 URL 中,所以请求变量有它。但是,有没有办法让我获取这个值,并在post()方法之外获取相应的俱乐部对象?比如pre-post()方法什么的。主要是因为我不想复制/粘贴club = Club.objects.get(...

一个更普遍的问题——所有方法以什么顺序执行?Django 在这方面的文档似乎很缺乏。

4

4 回答 4

10

这个关于通用显示视图的 DjangoProject 页面似乎是最有帮助的,imo。

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

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()
于 2019-12-16T21:40:45.823 回答
2

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

文档缺乏细节——直到我阅读了源代码我才真正明白。但是除了分布在多个文件中之外,源代码可读性很好。

于 2013-07-21T04:59:23.583 回答
2

事实上,你真的是在颠倒过来。代替 central ClubView,为每个单独的操作/页面设置一个视图类会更加灵活。例如,你可能有这样的事情:

class ClubListView(ListView):
    model = Club

class ClubDetailView(DetailView)
    model = Club

# etc...

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

如果有一些非常特殊的行为需要应用于所有视图,这取决于该行为的真正含义:如果它与此特定模型相关,则最好在模型本身或它的管理器中定义它; 如果它真的是特定于视图的东西,你应该编写和扩展一个 mixin 以及实际的视图类。

于 2013-07-21T18:08:04.337 回答
0

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

于 2013-07-21T08:54:57.820 回答