【问题标题】:Chameleon template global variables变色龙模板全局变量
【发布时间】:2013-12-20 00:29:48
【问题描述】:

我正在使用 Pyramid 1.3 及其用 Chameleon 编写的模板。 由于不同的页面或模板可能需要对每个页面进行全局样式表更改,我希望能够重新定义页面上 body 标记的类(当然,我更愿意从模板中执行此操作)。

<body class="${global_variable_or_something_else}"></body>

我尝试过的:

  • 使用子宏中的 tal:define="global body_class"。不工作。
  • 我尝试使用&lt;metal:div metal:define-slot="vars"&gt;...variable definition...&lt;/metal:div&gt;&lt;metal:div metal:fill-slot="vars"&gt;...redefinition...&lt;/metal:div&gt;,并重新定义子宏中的变量。它确实有效,但是如果我在父模板中有多个变量定义,而我只需要重新定义一个呢?

有没有更好的方法用 METAL 做得更好?

【问题讨论】:

    标签: python pyramid chameleon template-metal


    【解决方案1】:

    页面模板中的全局变量,就像 Python 中的全局变量一样,可以被覆盖。因此,您改为执行以下操作:

    <rootelement metal:define-macro="macroname"
                 tal:define="global var1 value1; global var2 value2">
        <metal:overrides define-slot="overrides"></metal:overrides>
        <!-- some template code using var1 and var2 -->
    </rootelement>
    

    然后使用metal:fill-slot 提供覆盖;您可以根据需要覆盖尽可能少或尽可能多的变量:

    <rootelement metal:use-macro="macroname">
        <metal:overrides fill-slot="overrides"><tal:defines define="global var1 differentvalue" /></metal:overrides>
    </rootelement>
    

    【讨论】:

    • 您使用什么版本的 Chameleon 来测试这个解决方案?
    • @AndreyCizov:无;我在这里根据 TAL(zope 页面模板)的(大量)经验做出假设。可能是 Chameleon 的实现已经优化了这个代码路径。
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2012-02-09
    • 2012-06-24
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多