4

プロファイル アプリである Idios を実行しています。アプリでプロファイルを idios の上に作成したいと思います (つまり、アプリ自体を変更せずに、idios pip-installable を維持します)。

問題は、プロファイル ビューが idios アプリで作成され、コンテキスト変数を渡すオブジェクト指向のアプローチを使用し、そのビューをテンプレートに表示することです。プロフィール ビューに、別の友達アプリで管理されるユーザーの友達のリストも含めたいと考えています。フレンドを Idios にインポートし、コンテキストを新しい friend_list 変数で更新し、別のテンプレート ブロックを追加してフレンド リストを表示するだけで、概念実証ができました。

では、idios アプリを変更せずに、友達リストとプロフィールの両方を組み合わせる最善の、または最も健全な方法は何でしょうか? この質問は基本的に、再利用可能なアプリをサポートする DRY の方法で Django の MVT システムを本当に理解するための助けを求めるものです。

4

3 に答える 3

3

ありがたいことに、前述のアプリはクラスベースのビューを使用しています。これは、クラスベースのビューを使用することで得られるメリットです。コンテキストを変更するには、プロファイルビューのサブクラスを作成するだけです。

yourapp / views.py

from idios.views import ProfileDetailView

class MyProfileDetailView(ProfileDetailView):
    def get_context_data(self, **kwargs):
        context = super(MyProfileDetailView, self).get_context_data(**kwargs)

        # get the list of friends and store it in a new key in `context`

        return context

次に、idiosがデフォルトで使用するurlpatternをurls.pyで再定義し(idios urlpatternsが含まれる前に実行する必要があります)、代わりにサブクラスをポイントします。

idios/whatever_template.html最後に、プロジェクト(またはアプリ)のディレクトリにファイルを作成して、idiosが使用するテンプレートを上書きしますtemplates。デフォルトのテンプレートをコピーして、自由に変更します。Djangoが利用できるすべてのオーバーライドのおかげで、実際に元のソースに触れる必要はまったくありません。

于 2011-12-30T21:50:34.423 に答える
1

これを行うにはProfileDetailView、プロジェクト内のアプリで idios からクラスのサブクラスを作成し、そのユーザーの友達に追加のコンテキストを追加します。このようなもの:

import idios.views

class ProfileDetailView(idios.views.ProfileDetailView):

    def get_context_data(self, **kwargs):
        context = super(ProfileDetailView, self).get_context_data(**kwargs)
        context['friends'] = get_friends(self.page_user)  # Or however it works
        return context

その後、このサブクラスをプロジェクトのビューとして使用できます。

于 2011-12-30T21:45:34.560 に答える
0

ユーザーの友達を他のビューにも含めたいと思う場合、DRY の方法は、カスタム テンプレート タグまたはフィルターを作成することです。次に、テンプレートをオーバーライドし、そこにテンプレート タグ/フィルターを含める必要があります。

この特定のビューにユーザーの友達のみを表示したい場合get_context_dataは、他の回答で説明されているようにオーバーライドします。

于 2011-12-30T22:12:57.357 に答える