在我的网站上,博客帖子出现在整个网站的多个位置。我想创建一个像blog_posts.html
这样的模板,给出博客文章列表(作为render
的参数)创建包含这些帖子的块,格式化和处理。
我想要显示几个断开连接的页面blog_posts
。因此,我不能说blog_posts
扩展它们中的任何一个。我想知道是否有办法将任何处理过的模板插入任意页面?如果是,如何将变量(可能是类的实例)传递给blog_posts模板?
答案 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>