【问题标题】:Django - One CBV to handle multiple scenariosDjango - 一个 CBV 来处理多个场景
【发布时间】:2018-09-19 05:17:36
【问题描述】:

我很难理解如何使用单个 CBV 来处理(至少)2 个不同的场景。这是我想要做的:

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

我想使用以下网址:

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 来显示相应的报告。

谢谢!

编辑:

这是一个点击流程

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    对于 Django 2+,在 urls.py 中使用路径而不是 url

    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
    

    【讨论】:

    • 谢谢!当我这样做时,我收到以下错误:Reverse for 'detail' with arguments '(UUID('ac987eb3-0aa9-4bc3-b2b1-404799f2a266'),)' not found. 1 pattern(s) tried: ['planning_detail.html/(?P&lt;uuid&gt;[0-9a-f-]+)/(?P&lt;layout&gt;\\w+)$']
    • @DevKing 你有没有尝试将 UUID 转换为字符串?
    • 嗨 - 你是什么意思?
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 2019-04-05
    • 2013-11-13
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多