2011-12-30 8 views
3

私はIdios, a profile appを実行しています。アプリのプロファイルをidiosの上に作成したいと考えています(アプリを変更せずにidiosをpip-installableにしておきます)。Djangoテンプレートコンテキストの複数の表示

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

idiosアプリを変更することなく、友人リストとプロフィールの両方を組み合わせるには、最高の、あるいは最も純粋なアプローチは何ですか?この質問は、基本的にが、再利用可能なアプリケーションをサポートするDRY方法で、DjangoのMVTシステムを理解する助けとなっています。

答えて

2

ありがとうございますが、上記のアプリではクラスベースのビューを使用していますが、これはクラスベースのビューを使用する利点です。

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 

すると、ちょうどURLPATTERN idiosを再定義するには、あなたのurls.pyにデフォルトで使用する(ニーズ:コンテキストを変更するには、単に自分のプロフィールビューのサブクラスを作成しますテンプレートidiosをオーバーライドするために、urlpatternsが含まれているidios前に行く)とサブクラスの代わりに

最後に

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

+0

お互いに助けてくれました。この説明はもう少し詳しく説明したので、私はそれを選択しましたが、両方とも十分です。私は、オブジェクト指向のアプローチに利点があることを知っていました。それは私がそれを見ることができないほど簡単でした:クラスの継承! – wrought

+0

ああ、私はちょうどこのように実装し、完璧に働きました。 – wrought

1

あなたのプロジェクトのアプリでiduchのProfileDetailViewクラスのサブクラスを作成し、そのユーザーの友だちの余分なコンテキストを追加することで、これを行うことができます。このような何か:あなたは、あなたのプロジェクト内のビューとして、このサブクラスを使用することができます

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 

0

他のビューにもユーザーの友人を含めるとよいと思われる場合、DRYの方法はcustom template tag or filterを作成することです。次に、テンプレートをオーバーライドして、そこにテンプレートタグ/フィルタを組み込むだけです。

この特定のビューにユーザーの友だちを表示したい場合は、他の回答に記載されているように、私はget_context_dataを上書きします。

+0

良い点は、私は疑問が提起された方法のために、上記の解決策で十分であったと思います。あなたのスーパーDRY方法は意味があります。 – wrought

+0

上記の方法はidiosプロファイルアプリに他の変更を加える必要があるのでいいです。私は自分のアプリでそれをすべてやって、サブクラスのビューなどを作成します。次のステップ(私は問題として追加します)は、idiosプロファイルだけでなく、複数のアプリケーションで使用するために友人ビューをさらに抽象化することです。 – wrought

関連する問題