在 CKAN 的 Jinja2 模板中插入静态 html
Insert static html in Jinja2 template in CKAN
我对html、jinja2、模板和一般的网站制作还很陌生,但我的雇主让我做这份工作,是外部委托的,所以我正在尽力而为。
我正在使用 CKAN 框架构建一个网站,它使用 Jinja2 进行模板制作。
在某些页面上,我们的客户要求包含静态 .html 文件(由他们提供)。该文件必须被渲染,即不显示原始代码。
最终页面必须如下所示:
"outer part" 由 Jinja2 处理,并遵循适用于所有页面的预定义布局和模板。 "internal box" 必须呈现客户提供的自定义 .html 文件(每页不同的文件)。
考虑到将来以某种方式为自定义 .html 文件获取正确的名称,我现在尝试只使用 an 。 html 文件出现。
我已经尝试在模板中添加一个块,例如
{% block static_html_desc %}
<script type="text/html", src="my_file.html">>/script>
{% endblock %}
但这不会产生任何结果(即在应该渲染的地方只有白色 space)。
然后我尝试了
{% block static_html_desc %}
{# include 'my_file.html' %}
{% endblock %}
哪一种有效,这意味着 my_file.html
仅当文件本身位于 /templates/
文件夹内时才会呈现,否则 jinja 会崩溃并出现 "no template found" 错误。
鉴于这个文件不是动态的,放在templates文件夹下感觉不对;会有几个这样的文件,所以将它们保存在 public 文件夹中并从那里提取我的 jinja2 模板也更合乎逻辑。
如前所述,我是这方面的初学者,因此非常感谢 Jinja2 或 CKAN 的任何帮助和细节。
我自己找到了一个很好的答案,张贴在这里以防其他人有同样的疑问。
以下内容改编自W3School的优秀教程:https://www.w3schools.com/howto/howto_html_include.asp
我创建了一个 javascript 文件 custom_include_html.js
,并将其放在我的 CKAN 插件的 /templates
文件夹中。 (我认为它不是模板文件,但它直接与模板相关,目前我不介意更改 jinja2 加载程序路径,所以我可以将它留在该文件夹中)。
该文件的内容如下,复制自 W3School 教程,但张贴在这里供您自己参考:
function includeHTML() {
var x, i, elem, file, xhttp;
z = document.getElementByTagName("*");
for (i=0; i<z.length; i++) {
elem = z[i];
file = elem.getAttribute("custom-include-html");
if (file) {
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readystate == 4) {
if (this.status == 200) {elem.innerHTML = this.responseText;}
if (this.status == 400) {elem.innerHTML = "Page not found, sorry."}
elem.removeAttribute("custom-include-html");
includeHTML();
}
}
xhttp.open("GET", file, true);
xhttp.send();
return;
}
}
};
然后,在定义要插入 my_file.html
文件的页面的 Jinja2 模板中,我创建了一个块
{% block static_html_desc %}
<div custom-include-html="/my_file.html"></div>
{% endblock %}
请注意,此文件位于 CKAN 的 public 文件夹中,正如我在上述问题中所希望的那样。
在模板底部,我将 javascript 脚本称为:
{% block custom_javascript %}
<script type="text/javascript">
{% include custom_include_html.js" %}
includeHTML();
</script>
{% endblock %}
文件 my_file.html
然后在 {% block static_html_desc %}
块中呈现。
此时,只需将对 my_file.html
的调用替换为非硬编码的内容,以便不同的页面加载相应的 *.html
文件。这可以通过模板辅助函数轻松完成。
我对html、jinja2、模板和一般的网站制作还很陌生,但我的雇主让我做这份工作,是外部委托的,所以我正在尽力而为。
我正在使用 CKAN 框架构建一个网站,它使用 Jinja2 进行模板制作。 在某些页面上,我们的客户要求包含静态 .html 文件(由他们提供)。该文件必须被渲染,即不显示原始代码。 最终页面必须如下所示:
"outer part" 由 Jinja2 处理,并遵循适用于所有页面的预定义布局和模板。 "internal box" 必须呈现客户提供的自定义 .html 文件(每页不同的文件)。
考虑到将来以某种方式为自定义 .html 文件获取正确的名称,我现在尝试只使用 an 。 html 文件出现。 我已经尝试在模板中添加一个块,例如
{% block static_html_desc %}
<script type="text/html", src="my_file.html">>/script>
{% endblock %}
但这不会产生任何结果(即在应该渲染的地方只有白色 space)。 然后我尝试了
{% block static_html_desc %}
{# include 'my_file.html' %}
{% endblock %}
哪一种有效,这意味着 my_file.html
仅当文件本身位于 /templates/
文件夹内时才会呈现,否则 jinja 会崩溃并出现 "no template found" 错误。
鉴于这个文件不是动态的,放在templates文件夹下感觉不对;会有几个这样的文件,所以将它们保存在 public 文件夹中并从那里提取我的 jinja2 模板也更合乎逻辑。
如前所述,我是这方面的初学者,因此非常感谢 Jinja2 或 CKAN 的任何帮助和细节。
我自己找到了一个很好的答案,张贴在这里以防其他人有同样的疑问。
以下内容改编自W3School的优秀教程:https://www.w3schools.com/howto/howto_html_include.asp
我创建了一个 javascript 文件 custom_include_html.js
,并将其放在我的 CKAN 插件的 /templates
文件夹中。 (我认为它不是模板文件,但它直接与模板相关,目前我不介意更改 jinja2 加载程序路径,所以我可以将它留在该文件夹中)。
该文件的内容如下,复制自 W3School 教程,但张贴在这里供您自己参考:
function includeHTML() {
var x, i, elem, file, xhttp;
z = document.getElementByTagName("*");
for (i=0; i<z.length; i++) {
elem = z[i];
file = elem.getAttribute("custom-include-html");
if (file) {
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readystate == 4) {
if (this.status == 200) {elem.innerHTML = this.responseText;}
if (this.status == 400) {elem.innerHTML = "Page not found, sorry."}
elem.removeAttribute("custom-include-html");
includeHTML();
}
}
xhttp.open("GET", file, true);
xhttp.send();
return;
}
}
};
然后,在定义要插入 my_file.html
文件的页面的 Jinja2 模板中,我创建了一个块
{% block static_html_desc %}
<div custom-include-html="/my_file.html"></div>
{% endblock %}
请注意,此文件位于 CKAN 的 public 文件夹中,正如我在上述问题中所希望的那样。
在模板底部,我将 javascript 脚本称为:
{% block custom_javascript %}
<script type="text/javascript">
{% include custom_include_html.js" %}
includeHTML();
</script>
{% endblock %}
文件 my_file.html
然后在 {% block static_html_desc %}
块中呈现。
此时,只需将对 my_file.html
的调用替换为非硬编码的内容,以便不同的页面加载相应的 *.html
文件。这可以通过模板辅助函数轻松完成。