2014-11-05 26 views
0

我工作在Django一個簡單的博客應用程序,我有麻煩搞清楚如何動態生成一個側邊欄的五個最新的帖子。我的每個觀點都是基於類的,他們擴展了一般的模板,每個視圖映射到一個模板,我相信是這樣做的正確方法。我看了一種方式來做到這一點使用模板標籤,但似乎Django不喜歡你把任何邏輯你的模板內。在邊欄中創建「最近的帖子」列表。

我相信問題是,我想這對我的base.html文件中存在,因爲我想要顯示的站點範圍的最近的職位,甚至應該映射到你的base.html文件視圖或確實會引起問題的,我對此很新。我不知道如何處理這個問題,我是否我應該創建base.html文件一個新的觀點,或者我應該用我的模板標籤,或者我是否應該擴展現有的視圖(但如果我這樣做,它贏得了」是站點範圍?)。

我基本上希望下面的(他們下令按時間倒序排列)

{% for post in post_list[:4] %} 
<a href="{{ post.get_absolute_url }}"> {{ post.title }} </a> 
{% endfor %} 

回答

2

可以使用模板標籤。更具體地說,你需要一個inclusion tag。這使您可以通過一個小型視圖樣代碼段將渲染片段插入模板中的任何位置。

from django import template 
register = template.Library() 

@register.inclusion_tag('blog/snippets/recent_posts.html') 
def render_recent_blogposts(): 
    return { 
     # This is just an example query, your actual models may vary 
     'post_list': BlogPost.objects.all().order_by("published_on")[:4] 
    } 

現在創建:在您的blog應用程序,並添加以下;

例如,創建一個templatetags/blog_tags.py文件(Django的默認這裏搜索對他們來說是一個你創建你的應用程序中的templatetags文件夾重要)一個blog/snippets/recent_posts.html模板(可以是隻要任何地方都mathecs的@register.inclusion_tag(...)以上):

<ul> 
    {% for post in post_list %} 
     <li><a href="{{ post.get_absolute_url }}"> {{ post.title }}</a></li> 
     ... 
    {% endfor %} 
</ul> 

最後,在你的原始模板,現在就可以使您的模板標籤:

<aside> 
    {% load blog_tags %} 
    {% render_recent_blogposts %} 
</aside> 
相關問題