在Django的几个页面中包含相同的块

时间:2016-08-21 21:28:24

标签: python django django-templates

在我的网站上,博客帖子出现在整个网站的多个位置。我想创建一个像blog_posts.html这样的模板,给出博客文章列表(作为render的参数)创建包含这些帖子的块,格式化和处理。

我想要显示几个断开连接的页面blog_posts。因此,我不能说blog_posts扩展它们中的任何一个。我想知道是否有办法将任何处理过的模板插入任意页面?如果是,如何将变量(可能是类的实例)传递给blog_posts模板?

2 个答案:

答案 0 :(得分: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' %};包含的模板可以访问传递给父母的所有变量。之一。

答案 1 :(得分: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>