2011-10-26 4 views
0

私は新しいプロジェクトを開始しようとしていますが、今回はdjangoが行く方法だと思います。私は過去2週間のドキュメンテーションを読んできました。djangoを使ってベーステンプレートでダイナミックメニューを作る方法

[OK]を、私は(C#MVCで)部分的なレンダリングについて何かを見つけることができなかったことです。たとえば、メニュー項目がデータベースから来る動的なメニューが必要な場合は、基本テンプレート(またはマスターページ)が各リクエストでメニューをレンダリングすることが期待されます(部分レンダラーは別のアクションを呼び出すか、セッションデータ)。だから、私のテンプレートがこの基本テンプレートから継承されている限り、メニューは無料で提供されます。

正直なところ、私はこれを達成するための手掛かりがありません。


私が望むのは、子テンプレートに含まれていないデータを使用する基本テンプレートのコードです。私はrender_to_response( 'child_content.html'、コンテキスト)を呼び出すたびに余分な変数(多分 'menu_list_items')を含めることはしません。これは可能ですか?

ありがとうございます!

答えて

6

この機能を提供するには、context processorまたはcustom template tagのいずれかを使用できます。

context_processorはすべてのRequestContextにオブジェクトを追加できる単純な関数です。カスタムテンプレートタグには、メニューをレンダリングできる独自のテンプレートスニペットとコンテキストがあります。

+0

それはトリックを行う必要があります:)タンクあなた –

0

テンプレートを再利用する場合は、汎用レイアウトの基本テンプレートを作成し、個々のページに詳細なテンプレートを使用するだけです。これは既にDjango documentationによって詳細にカバーされています。

私はそれらの一般的な部分(例えば、使用がオンになっているサイトの現在の一部をハイライトメニューを言う)のために行う傾向にある何、次のように似て、私自身のrender_to_response関数を作成することです:

from django.shortcuts import render_to_response as django_render_to_response 
def render_to_response(template, params, context_instance): 
    return django_render_to_response(template, 
         AppendStandardParams(request, params), 
         context_instance) 

ApplyStandardParams方法は、現在のパスに基づいてメニューを構成:

def AppendStandardParams(request, params): 
    if request.META['PATH_INFO'].startswith('/customer'): 
     params['category'] = 'customer' 
     params['title'] = 'Customer overview' 
    # and so on for all different parts 

この例では、これらcategorytitleタグは、メニューを強調するために使用されるいくつかの値であり、設定タイトルなどが含まれます。たとえば:

<!-- Customer menu entry: change class if this is the current category. --> 
<li{% if category == "customer" %} class="selected"{% endif %}>Customers</li> 

は最後に、代わりに通常のrender_to_response輸入の、ビューでそれを使用するために、私はちょうどビューで私のカスタムバージョンが利用できるようになりfrom lib.views import *ような何かを、行います。この方法では、ビュー内のすべてのコードの構文は同じですが、新しいビューまたはアプリケーションを作成するたびにメニューをカスタマイズする必要はありません。

関連する問題