2014-11-05 67 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> 
相关问题