【问题标题】:Including the same blocks in several pages in Django在 Django 的多个页面中包含相同的块
【发布时间】:2016-08-21 21:28:23
【问题描述】:

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

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

【问题讨论】:

    标签: python django django-templates


    【解决方案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' %} 放在另一个模板中;包含的模板将有权访问传递给“父”的所有变量。

    【讨论】:

      【解决方案2】:

      您可能需要考虑使用模板标签。包含标签之类的东西应该可以很好地为您服务(请参阅此处的文档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>
      

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 2014-06-21
        • 2011-11-07
        • 2016-01-10
        相关资源
        最近更新 更多