Django - один CBV для обработки нескольких сценариев - PullRequest
0 голосов
/ 19 сентября 2018

У меня проблемы с пониманием того, как использовать один CBV для обработки (как минимум) 2 различных сценариев.Вот что я пытаюсь сделать:

  1. У меня есть ListView для отображения списка объектов.Оттуда я генерирую ссылку, чтобы перейти к
  2. DetailView, чтобы отобразить детали объекта.Оттуда я создаю ссылку на
  3. другое представление для отображения связанного отчета.

Я хотел бы использовать следующие 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 голосов
/ 19 сентября 2018

Для 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
...