在 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 模板继承

django:相同的模板标签,但在多个继承的 html 模板中

Django4.3_templates模板之继承标签extends和include添加标签

Django 模板继承破坏了站点布局

Python学习---django模板继承180123

Django模板继承 - 如何为不同的块使用相同的内容