在 Django 模板中标记或继承相同的代码,并进行细微的更改
Posted
技术标签:
【中文标题】在 Django 模板中标记或继承相同的代码,并进行细微的更改【英文标题】:Tag or inherit the same code in Django template with minor changes 【发布时间】:2018-07-25 14:19:44 【问题描述】:我有一堆代码需要在一个页面和多个页面上重复使用。例如,下面是一个较短版本的代码:
<a href="#"
data-toggle="popover"
title="% for terms in s_terms %% if terms.slug == 'neuron' %terms.title% endif %% endfor %"
data-content="% for terms in s_terms %% if terms.slug == 'neuron' %terms.para_one% endif %% endfor %">
Toggle popover
</a>
块中有更多代码。现在,出于显而易见的原因,我不想继续重复如此大的代码块。我是 DRY 方法的粉丝。
但是,我不知道如何重复呈现同一段代码。唯一会改变的是那里的单词=“神经元”。我想过使用模板标签,但没有奏效。
我尝试将代码保存为单独的文件,并在我的模板中继承它,但是我无法更改关键字('neuron')。我还尝试创建一个单独的动态页面,并将其包含在我的 Django 模板中,但看起来包含标记仅适用于模板,不适用于动态页面。
有人可以帮忙吗?提前谢谢你。
【问题讨论】:
为什么模板标签不起作用?它们是正确的解决方案。 谢谢。我尝试return value.replace
传递一个单词并让模板标签用上面的代码替换这个单词,同时在代码中包含这个单词。我在模板中将其称为neuron | my_custom_tag.
,但我只是收到了一个模板错误。你介意尝试一下定义模板标签吗……不知道为什么它一直给我一个错误。
【参考方案1】:
您可以使用 Django 模板内置模板标签include。
来自文档:
加载模板并使用当前上下文呈现它。这是一个 在模板中“包含”其他模板的方式。
因此,您可以将您的 sn-p 提取到单独的模板中,然后将其用于:
% include "snippet_template.html" %
此外,您可以使用 with
关键字将变量传递给包含模板 - 您可以使用它来传递您的 word
参数:
% include "snippet_template.html" with word="neuron" %
【讨论】:
谢谢@bonidjukic。这正是我想要做的,但我被困在如何在 sn-p_template,htm 中修改我的代码,以便它知道在哪里插入“单词”(在这个例子中:神经元)。你能帮忙吗? 好吧,一旦你将word
变量传递给sn-p 模板,它就会在其中可用;例如:...% if terms.slug == word %...
当我尝试直接插入 django 模板时效果很好,但当我尝试使用 safe
命令将其通过数据库时却不行。因为,这是一个稍微不同的问题,我希望我不是唯一一个试图找到解决方案的人,我创建了一个单独的操作系统问题。你介意看看 [***.com/questions/48797931/…,如果你觉得舒服的话。【参考方案2】:
正如@bonidjukic 所写,include
声明就是您要搜索的内容。
但是 for 循环中的 include
语句可能会触及 Django 模板引擎的一个弱点(与 Jinja 相比)。你只包括变量,所以它会很快。
在需要标签的情况下(如trans
),Django 会在每个包含处加载标签。 Jinja 将在哪里拥有全局“标签”。
所以要小心,你如何干燥你的模板。
【讨论】:
感谢@Zulu,这是有道理的。我对 Jinja 完全不熟悉,但我会在今天晚些时候尝试熟悉文档。以上是关于在 Django 模板中标记或继承相同的代码,并进行细微的更改的主要内容,如果未能解决你的问题,请参考以下文章
django:相同的模板标签,但在多个继承的 html 模板中