我有一个具有基本 URI 的在线文档 Django 应用程序:
/path/to/docs/<DOMAIN>/
这允许您查看该域中的文档列表。它使用 GCBV ListView。您可以使用以下命令请求DOCNAME的DetailView :
/path/to/docs/<DOMAIN>/<SLUG>/
其中 SLUG 是非常不言自明的,它返回一个记录作为一个好的 slug 应该。这些有子页面,带有自己的模板,大致如下:
/path/to/docs/<DOMAIN>/<SLUG>/foo/
/path/to/docs/<DOMAIN>/<SLUG>/bar/
/path/to/docs/<DOMAIN>/<SLUG>/baz/
对于未版本化的文档,这很简单。但是,在另一个 DOMAIN(我们称之为“联合”)中,我确实有不同版本的 DOCNAME 可用:
/path/to/docs/<DOMAIN>/<SLUG>/<VERSION>/
和
/path/to/docs/<DOMAIN>/<SLUG>/<VERSION>/foo/
/path/to/docs/<DOMAIN>/<SLUG>/<VERSION>/bar/
/path/to/docs/<DOMAIN>/<SLUG>/<VERSION>//baz/
在这种情况下,如果用户请求:
/path/to/docs/<DOMAIN>/<SLUG>/
我不希望向用户呈现 DetailView - 我希望向他们呈现具有可用文档的每个 VERSION 的 ListView:
Fantastic docs - Version 1 (/path/to/docs/federated/fantastic/1/)
Fantastic docs - Version 2 (/path/to/docs/federated/fantastic/2/)
Fantastic docs - Version 3 (/path/to/docs/federated/fantastic/3/)
我已经对 GCBV 做了一些相当广泛的阅读,并且之前在不同的应用程序中对它们中的许多进行了子类化,但我怀疑我不能在urls.py中有一个条目来处理这两种类型的查询(详细信息和列表视图)。事实上,Django 文档警告不要混合 GCBV,尤其是 wrt get_context_data()。
我可以在 Mixin 内部做的是查看 DOMAIN 名称,并在此基础上将请求分叉到 ListView(用于版本化文档)或 DetailView(用于非版本化文档)。我已经搜索了所有 Django 文档,但没有看到任何示例。谁能帮我吗?
注意: 我确实想到了一个想法:在urls.py中,我实际上可以在模式中硬编码 DOMAIN 名称。因此,不要使用kwarg <domain>:
urlpatterns = patterns('',
url(r'^(?P<domain>[\w-]+)/(?P<slug>[\w-]+)/(?P<version>\d{1})/$', MyMixin.as_view(
queryset=Docs.objects.all()
),
)),
)
并在视图中使用域kwarg 作为逻辑确定器(对于 if/else),我可以执行以下操作:
urlpatterns = patterns('',
url(r'^federated/(?P<slug>[\w-]+)/(?P<version>\d{1})/$', MyListViewMixin.as_view(
queryset=Docs.objects.all()
),
)),
url(r'^nonfederated/(?P<slug>[\w-]+)/$', MyDetailViewMixin.as_view(
queryset=Docs.objects.all()
),
)),
)
但是,我不知道有多少文档 DOMAIN 会被版本化,有多少不会。我需要尽可能通用(请原谅双关语)。提前致谢。