2016-08-21 71 views
0

在我的網站上,博客帖子出現在整個網站的多個位置。我想創建一個模板,如blog_posts.html,給定博客帖子列表(作爲render的參數),創建包含這些帖子的塊,並進行格式化和處理。在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 %} 

任何視圖的用法。請確保您設置數據的任何地方,你還需要使用模板標籤

def example_view(request): 
    context = {'data': Blog.objects.all()} 
    return render(request, 'example.html', context) 

另一種選擇是明確把它作爲一個參數這樣

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

然後使用

{% blog_posts data %} 

當然你在包含標籤中使用的blog_posts.html文件會做類似於循環數據的操作

<div> 
    {% for post in blog_posts %} 
    <p>{{ post.name}} 
    {% endfor %} 
</div> 
相關問題