在 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 文件。这可以通过模板辅助函数轻松完成。