2016-08-21 9 views
0

私のウェブサイトでは、ブログ投稿がサイト全体の複数の場所に表示されます。ブログ記事のリスト(renderへの引数として)を指定すると、書式付きで処理されたこれらの投稿を含むブロックが作成されるというblog_posts.htmlのようなテンプレートを作成したいと思います。Djangoの複数のページに同じブロックを含める

blog_postsを表示したいいくつかの切断されたページがあります。したがって、私はblog_postsがそれらのどれかを拡張するとは言えません。任意のページに処理されたテンプレートを挿入する方法があるのだろうか?はいの場合、変数(クラスのインスタンスかもしれません)をblog_postsテンプレートに渡す方法はありますか?

答えて

1

あなたは文字列にblog_posts.htmlをレンダリングし、他のテンプレートに変数として渡すことができ、次のいずれか

from django.template.loader import get_template 
blog_posts = get_template('/path/to/blog_posts.htm') 
somevar = blog_posts.render({'foo': 'foo', 'bar': 'baz'}) 

、他のテンプレートに{{ somevar }}を置く - あるいは単に{% include '/path/to/blog_posts.html' %}他で。インクルードされたテンプレートは、「親」に渡されたすべての変数にアクセスできます。

0

テンプレートタグの使用を検討してください。インクルードタグのようなものがうまく機能するはずです(ドキュメントhttps://docs.djangoproject.com/en/1.10/howto/custom-template-tags/#inclusion-tagsを参照してください)

データを渡すにはtakes_context引数を使用できます。任意のページでは、すでにビューで「データ」のコンテキスト変数、この機能でしょう。この

@register.inclusion_tag('/path/to/blog_posts.html', takes_context=True) 
def blog_posts(context): 
    return { 
     'blog_posts': context['data'], 
    } 

のようなその上にピックアップその後での使用HTMLでそのページを読み込むことができますに含めるタグを使用するようにあなたがブログ投稿を引きたいファイル

{% blog_posts %} 

任意のビューからの使用。その後

@register.inclusion_tag('/path/to/blog_posts.html') 
    def blog_posts(context, data): 
     return { 
      'blog_posts': data, 
     } 

に この

のように別のオプションを明示的に引数として渡すことです
def example_view(request): 
    context = {'data': Blog.objects.all()} 
    return render(request, 'example.html', context) 

あなたはまた、テンプレートタグを使用したいあなたはどこにでもデータを設定することを確認し、使用

{% blog_posts data %} 

もちろん、包含タグで使用されているblog_posts.htmlファイルは、データをループするような処理を行います。

<div> 
    {% for post in blog_posts %} 
    <p>{{ post.name}} 
    {% endfor %} 
</div> 
関連する問題