Django模板块:我如何重用它们以及如何将HTML传递给它们?

时间:2014-01-10 13:03:42

标签: django django-templates template-engine

作为熟悉Ruby的前端,我正在尝试学习Django模板系统。

它似乎是我习惯的内外版本。我很难理解它的反向意识形态:在Django中,你可以将模板的某些部分标记为可覆盖,而不是在必要时声明可重用的块并包含它们。

以下是我对此不了解的两件事。

  1. 使用Ruby的Padrino,我会声明一个部分(一个可重复使用的模板化HTML片段),然后将其包含在多个位置。无论我在哪里,它都会输出HTML。

    根据Django的templating documentation,每个只能在一次的页面上使用:最后,请注意您无法定义多个阻止同一模板中具有相同名称的标签。

  2. Padrino的另一个特点是我觉得非常有用的是,partials可以接受HTML并在它们内部的某个位置输出(产生)它。下面是几个例子,一个是Padrino,另一个是Jade。

    请注意,HTML不是作为字符串(通过参数笨拙地传递),而是通过嵌套以模板语言。

  3. Padrino(Ruby)示例

    使用Padrino,我可以将HTML模板代码传递给partials:

    _container.erb

    <div class="container <%= myclass %>">
      <div class="container-inner">
        <%= yield %>
      </div>
    </div>
    

    layout.erb

    <%= partial 'container', locals: { myclass: 'container--header' } do %>
      <h1><%= Sitename %></h1>
      <p>Welcome to my humble place</p>
    <% end %>
    

    生成的HTML

    <div class="container container--header">
      <div class="container-inner">
        <h1>Sitename</h1>
        <p>Welcome to my humble place</p>
      </div>
    </div>
    

    Jade示例

    在Jade中,partials被称为mixins,由模板引擎而不是后端框架直接处理:

    玉源

    mixin article(title)
      .article
        .article-wrapper
          h1= title
          if block
            block
          else
            p No content provided
    
    +article('Hello world')
      p This is my
      p Amazing article
    

    结果HTML

    <div class="article">
      <div class="article-wrapper">
        <h1>Hello world</h1>
        <p>This is my</p>
        <p>Amazing article</p>
      </div>
    </div>
    

    Django可以吗?

    问题:

    1. 如何在Django中多次重用块?我想声明一段模板代码并将其包含在页面的多个位置。
    2. 如何将HTML(模板代码)传递到块中?我想重复使用不同的内容。
    3. 我想要覆盖的用例是一个可重复使用的部分/ mixin /块,它可以作为网站每个部分的容器包装。

      请注意,使用Padrino,我甚至可以通过这样的方式制作部分,它可以让我选择哪个包装器标签(div,nav,header ...)应该用于部分的每个实例,方法是包含部分的参数:

      <% partial 'container', myclass: 'container--header', tag: 'nav' %>
      

      我想知道如何用Django做到这一点。

      在你的回答中,请评论是否可以同时使用a)基本的Django功能; b)一些Django扩展。

      谢谢。

1 个答案:

答案 0 :(得分:1)

我不熟悉Padrino,所以我不能100%确定我理解你在寻找什么。

然而,Django模板块肯定不等同于Padrino的部分。根据您的描述,我认为等效的是custom template tags

概括地说,要创建自定义模板标记,您需要:

  1. 在Django应用程序中创建一个templatetags模块,其中包含一个文件,用于包含标签的Python代码,例如。

    yourapp/
        models.py
        templatetags/
            __init__.py
            mytemplatetags.py
    
  2. 在该文件中,创建一个名为register的变量,该变量是django.template.Library的实例:

    # mytemplatetags.py
    
    from django import template
    
    register = template.Library()
    
  3. 在该文件中,为您想要的每个自定义标记编写一个函数。

  4. 对于包含模板代码段的代码,您需要撰写inclusion tag

    包含标记可以带参数,可以包括HTML(但只能作为字符串)。