Django-一个可处理多种情况的CBV

时间:2018-09-19 05:17:37

标签: python django django-urls

我很难理解如何使用单个CBV处理(至少)两种不同的情况。这是我想要做的:

  1. 我有一个ListView来显示对象列表。从那里,我生成一个链接以导航到
  2. DetailView,用于显示对象的详细信息。从那里,我生成一个指向
  3. 的链接
  4. 用于呈现相关报告的其他视图。

我想使用以下URL:

1. /myapp/list.html/
2. /myapp/detail.html/<<uuid>>/
3. /myapp/detail.html/<<uuid>>/?<layout>

方案2和3我正在考虑使用单个CBV,但我不了解如何区分方案。你能建议我的urls.py和views.py看起来像什么吗?

编辑:同时,我将需要使用两个不同的模板(或以某种方式区分要在模板中显示的内容):如果我正在调用/myapp/detail.html/<>/,那么我想查看对象详细信息。如果我正在呼叫/myapp/detail.html/<>/?我想渲染一个iframe以显示相应的报告。

谢谢!

编辑:

这是点击流click flow

1 个答案:

答案 0 :(得分:0)

对于Django 2+,请使用路径代替url中的urls.py

urls.py

from django.urls import path, re_path
urlpatterns = [
    path('/myapp/list.html/', MyModelListView.as_view(), name="mymodel_list"),
    re_path(r'^/myapp/detail.html/(?P<uuid>[0-9a-f-]+)/(?P<layout>\w+)$', MyModelDetailView.as_view(), name="mymodel_detail"),
]

Views.py

from django.views.generic import ListView, DetailView

class MyModelListView(ListView):
    model = MyModel


class MyModelDetailView(DetailView):
    model = MyModel

    def get_queryset(self):
        layout = self.kwargs.get("layout", None)
        uuid = self.kwargs.get("uuid")
        # Your logic goes here