0

ベース 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 がバージョン管理されるドキュメントの数と、バージョン管理されないドキュメントの数はわかりません。私はできるだけ一般的である必要があります(しゃれを許してください)。前もって感謝します。

4

1 に答える 1

1

混合ListViewDetailViewて 1 つのビューにする (概念的に混乱し、保守が困難になる) 代わりに、すべてのビューをバージョン管理されているかのように設計し、バージョン管理されていないビューをバージョン1(または同様の未指定のバージョン番号) を持つビューとして扱うことをお勧めします。

フェデレーションされていない Web サイトでは、URL/path/to/docs/<DOMAIN>/<SLUG>/は にアクセスした場合と同じように動作します/path/to/docs/<DOMAIN>/1/<SLUG>/

フェデレーション Web サイトでは、URL/path/to/docs/<DOMAIN>/<SLUG>/は使用可能なバージョンのリストを ( としてListView) 表示します。

上記の動作は、次のことを行うビューで実装できます。

  • このドメインで利用可能なバージョンの数を確認してください
  • 1 つしかない場合は、 にリダイレクトし/path/to/docs/<DOMAIN>/<LATEST_VERSION>/<SLUG>/ます。
  • 複数ある場合は、利用可能なバージョンのリストを表示し、ユーザーがアクセスするバージョンを選択できるようにします。

フェデレーションされていない Web サイトは、ドキュメントのバージョンが 1 つしかない Web サイトです。将来これが変更された場合は、それらをバージョン管理されたドキュメントに簡単に変換することもできます。

于 2013-01-20T21:52:22.377 に答える