2016-08-21 34 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> 
相关问题