python - 我如何在 jinja2 中构建可重用的小部件?

标签 python flask jinja2

我想定义一个类似这样的小部件:

{% block css %}
.mywidget {
     css: goes_here;
{% endblock %}

{% block widget %}
<div class="mywidget">
   <!-- structure goes here -->
</div>
{% endblock %}

{% block script %}
$( ".mywidget" ).addFunctionality(stuff)
{% endblock %}

换句话说,减速小部件需要什么 CSS,它的内容是什么(最好以某种方式参数化),以及它在文件末尾需要什么脚本。然后,我希望能够扩展布局模板,向主体添加小部件(可能是具有某种不同参数的相同类型的多个小部件),并将 CSS 和 javascript 正确添加到顶部和底部布局模板,每种小部件类型一次。

这看起来是一个非常干净和直接的设计,从原生 UI 设计的角度来看,我很困惑为什么我找不到任何关于如何做这样的事情的例子。

最佳答案

您充实了小部件系统的部分设计,但实际上只展示了如何着手设计小部件。另一部分是您最终将如何在 Jinja 中使用小部件。

例如,您可以使用 Jinja Macros定义小部件。创建文件“mywidget.html”并使用...

{% macro css() -%}
    .mywidget {
         css: goes_here;
    }
{% endmacro %}

{% macro widget() -%}
    <div class="mywidget">
        <!-- structure goes here -->
    </div>
{% endmacro %}

{% macro script() -%}
    $( ".mywidget" ).addFunctionality(stuff)
{% endmacro %}

然后,在使用此小部件的 HTML 中,您可以...

{% import 'mywidget.html' as mywidget %}

...
<html>
<head>
    <style>
        {{ mywidget.css() }}
    </style>
<head>
<body>
    {{ mywidget.body() }}

    <script>
        {{ mywidget.script() }}
    </script>
</body>
</html>

当然,这里的问题是您需要手动将所有小部件放入各个区域。一旦你获得大量的小部件,可能很难跟踪它们,并且很容易,例如,多次创建 mywidget.script() 代码,这将导致重复的事件触发。

当然,您始终可以将 Python 对象作为呈现最终解决方案的上下文的一部分。需要注意的重要一点是 Jinja 只是从模板中呈现文本。模板甚至不必是 HTML 模板,您可以使用 Jinja 来呈现纯文本电子邮件。因此,很难想象图书馆的作者会尝试创建此类“小部件”系统并期望每个人都对结果感到满意。为什么要用他们需要支持的如此复杂的功能来增加库的复杂性(特别是因为 Jinja 已经为人们提供了构建此类框架的工具)?

关于python - 我如何在 jinja2 中构建可重用的小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525447/

相关文章:

python - Flask 找不到模板

python - 有没有办法从字符串渲染 mako 模板?

python - Pandas - 将 12 小时转换为 24 小时(但删除 1900-01-01)

python - opencv python使用roxPolyDP在植物托盘中找到正方形

python - 具有可变输入的 Flask url

python - 处理数据库断开连接

flask - 使用flask运行python时的部分输出

python - WTForms render_field() 方法引用 for 循环变量

javascript - 忽略 div 内的标签,直到被点击

python - 如何在 PyQt 中创建可折叠框