ベース URI を持つオンライン ドキュメント Django アプリがあります。
/path/to/docs/<DOMAIN>/
これにより、その DOMAIN 内のドキュメントのリストを表示できます。GCBV ListViewを使用します。以下を使用して、DOCNAMEのDetailViewを要求できます。
/path/to/docs/<DOMAIN>/<SLUG>/
ここで、SLUG は一目瞭然で、適切なスラッグのように 1 つのレコードを返します。これらには、次の行に沿って、独自のテンプレートを含む子ページがあります。
/path/to/docs/<DOMAIN>/<SLUG>/foo/
/path/to/docs/<DOMAIN>/<SLUG>/bar/
/path/to/docs/<DOMAIN>/<SLUG>/baz/
これは、バージョン管理されていないドキュメントの場合は簡単です。ただし、別のドメイン (「フェデレーション」と呼びましょう) では、さまざまなバージョンの 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 を表示したくない - ドキュメントが利用可能な各バージョンの 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についてかなり広範囲に読んで、以前にさまざまなアプリでそれらの多くをサブクラス化しましたが、これらのタイプの両方のクエリ(DetailとListView)を処理するためにurls.pyに単一のエントリを持つことができないのではないかと疑っています。実際、Django のドキュメントでは、GCBV の混在、特に get_context_data() について警告しています。
Mixin の内部でできることは、DOMAIN 名を見て、それに基づいて、リクエストを ListView (バージョン管理されたドキュメントの場合) または DetailView (バージョン管理されていないドキュメントの場合) にフォークすることです。Django ドキュメント全体を検索しましたが、この例は見当たりません。誰でも私を助けることができますか?
注: 1 つの考えが思い浮かびます: 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 がバージョン管理されるドキュメントの数と、バージョン管理されないドキュメントの数はわかりません。私はできるだけ一般的である必要があります(しゃれを許してください)。前もって感謝します。