2017-02-11 3 views
1

私はDjangoテンプレートを持っています。これをindex.htmlという3つのパート(ヘッダー、コンテンツ、フッター)に分割して呼ぶことにしましょう。ヘッダーセクションには、ドロップダウンメニューを含む検索バーがあり、そこからオプションを選択して、選択したオプションに基づいて検索することができます。私はそのヘッダーセクションをすべて私の将来のビュー/テンプレートに含めるようにして、引き続きすべてのオプションを含むドロップダウンメニューを表示します。Djangoすべてのビューに共通のビュー機能を再利用する方法

これは

{% block content %} 

<div> 
<h1> My Cart </h1> 
</div> 

{% endblock %} 

これは何であるこれは私がcart.html {%が "index.htmlを" %を拡張}持っているものです私は現在、私のビューファイルに持っているもの

def index(request): 
    return render(
        request, 
        'home.html', 
        {'categories': get_all_categories()} 
       ) 


def cart(request): 
    return render(request, 'cart.html', {'categories': get_all_categories()}) 


def help(request): 
    return render(request, 'help.html', {'categories': get_all_categories()}) 


def about(request): 
    return render(request, 'about.html', {'categories': get_all_categories()}) 


def contact(request): 
    return render(request, 'contact.html', {'categories': get_all_categories()}) 


def search(request): 
    return render(request, 'search.html', {'categories': get_all_categories()}) 


def get_all_categories(): 
    return Category.objects.all() 

ですcontact.htmlは

{% block content %} 

<div> 
<h1> Contact </h1> 
</div> 

{% endblock %} 

T {% "はindex.htmlを" %を拡張}ました彼はhome.htmlが

{% block content %} 

<div> 
<h1> Home </h1> 
</div> 

{% endblock %} 

これが今動作しますが、私はする必要がないように、これを解決するためのより良い方法があった場合、私は思っていた{%が「index.htmlを」%を拡張}を含むものですすべてのビューで同じコードを繰り返します。

答えて

1

context processorというカスタムを書き込んで、その変数をレンダリングするすべてのテンプレートに含めることができます。例えば

、次のようなコンテキストプロセッサを書く(context_processors.pyで、言う):

def category_context_processor(request): 
    return { 
     'categories': get_all_categories(), 
    } 

そしてsettings.pyに含める:

TEMPLATES = [ 
    ... 
    'OPTIONS': { 
     'context_processors': [ 
      ... 
      'myapp.context_processors.category_context_processor', 
     ], 
    }, 
} 

今変数categoriesは、すべてのテンプレートで提供されていますビューから実際に渡すコンテキストにかかわらず、renderコールまたはRequestContextを使用してレンダリングします。

0

テンプレートタグを使用することもできます。

あなたpoll_extras.pyファイルで
polls/ 
    __init__.py 
    models.py 
    templatetags/ 
     __init__.py 
     poll_extras.py 
    views.py 

from django import template 

register = template.Library() 

@register.simple_tag 
def get_categories(request, arg1, arg2, ...): 
    return { 
     'categories': get_all_categories(), 
    } 

それとも、独自のテンプレート(すべてのビューで同じ滞在)でinclusion_tagを使用することができます。

@register.inclusion_tag('categories_block_template.html') 
def get_categories(arg1, arg2, *args, **kwargs): 
    categories = Category.objects.filter(field1=arg1, ...) 
    ... 

そして最後に、中テンプレートを読み込んでテンプレートタグを使用して使用する必要があるテンプレート:

{% load poll_extras %} 

あなたはtemplatetagsの詳細を見ることができますhere

+0

私の意見では、[Django Classy Tags](https://django-classy-tags.readthedocs.io/en/latest/)はプラスです。 –

関連する問題