作为熟悉Ruby的前端,我正在尝试学习Django模板系统。
它似乎是我习惯的内外版本。我很难理解它的反向意识形态:在Django中,你可以将模板的某些部分标记为可覆盖,而不是在必要时声明可重用的块并包含它们。
以下是我对此不了解的两件事。
使用Ruby的Padrino,我会声明一个部分(一个可重复使用的模板化HTML片段),然后将其包含在多个位置。无论我在哪里,它都会输出HTML。
根据Django的templating documentation,每个块只能在一次的页面上使用:最后,请注意您无法定义多个阻止同一模板中具有相同名称的标签。
Padrino的另一个特点是我觉得非常有用的是,partials可以接受HTML并在它们内部的某个位置输出(产生)它。下面是几个例子,一个是Padrino,另一个是Jade。
请注意,HTML不是作为字符串(通过参数笨拙地传递),而是通过嵌套以模板语言。
使用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中,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>
问题:
我想要覆盖的用例是一个可重复使用的部分/ mixin /块,它可以作为网站每个部分的容器包装。
请注意,使用Padrino,我甚至可以通过这样的方式制作部分,它可以让我选择哪个包装器标签(div,nav,header ...)应该用于部分的每个实例,方法是包含部分的参数:
<% partial 'container', myclass: 'container--header', tag: 'nav' %>
我想知道如何用Django做到这一点。
在你的回答中,请评论是否可以同时使用a)基本的Django功能; b)一些Django扩展。
谢谢。
答案 0 :(得分:1)
我不熟悉Padrino,所以我不能100%确定我理解你在寻找什么。
然而,Django模板块肯定不等同于Padrino的部分。根据您的描述,我认为等效的是custom template tags。
概括地说,要创建自定义模板标记,您需要:
在Django应用程序中创建一个templatetags模块,其中包含一个文件,用于包含标签的Python代码,例如。
yourapp/
models.py
templatetags/
__init__.py
mytemplatetags.py
在该文件中,创建一个名为register
的变量,该变量是django.template.Library
的实例:
# mytemplatetags.py
from django import template
register = template.Library()
在该文件中,为您想要的每个自定义标记编写一个函数。
对于包含模板代码段的代码,您需要撰写inclusion tag。
包含标记可以带参数,可以包括HTML(但只能作为字符串)。