Templates 如何使用Tale为tal:attributes中的同一属性设置多个值

Templates 如何使用Tale为tal:attributes中的同一属性设置多个值,templates,chameleon,template-tal,Templates,Chameleon,Template Tal,我试图在一个元素上设置多个css类 不幸的是,这不起作用,因为它返回:LanguageError:属性中的属性名称重复。 <ul> <li tal:repeat="item mainnav" tal:attributes="class 'first' if repeat.item.start else nothing; class 'last' if repeat.item.end else nothin

我试图在一个元素上设置多个css类

不幸的是,这不起作用,因为它返回:
LanguageError:属性中的属性名称重复。

<ul>
    <li tal:repeat="item mainnav"
        tal:attributes="class 'first' if repeat.item.start else nothing; 
                        class 'last' if repeat.item.end else nothing;
                        class 'active' if item.active else nothing">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>
将这3种情况合并到一个表达式中会使其变得非常复杂,因为有6种不同的css状态:

  • 第一+主动
  • 首先
  • 最后+活动
  • 最后
  • 活跃的
  • (无)
我可以想到两种可能的解决方案:

->在线检查每个组合:

<ul>
    <li tal:repeat="item mainnav" 
        tal:attributes="
            class 'first active' if (repeat.item.start and item.active) else
                  'first'        if repeat.item.start else
                  'last active'  if (repeat.item.end and item.active) else
                  'last'         if repeat.item.end else
                  'active'       if item.active else nothing">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>
->创建一个返回组合css类的方法

现在,有更好的方法吗?如果没有,那两种方法中哪一种更好(可能是后一种,因为如果内联脚本变得更复杂,那么它将变得不可读/不可管理)


顺便说一句,关于变色龙、故事有什么好的参考资料和例子吗。我不喜欢过度嵌套的条件句,让你无从下手。 还没有测试过这个,但你可能会有这个想法

<ul>
    <tal:myloop tal:repeat="item mainnav">
        <li tal:condition="item.active" tal:attributes="class 
            'active first' if repeat.item.start 
            else 'active last' if repeat.item.end 
            else 'active'">
            <a tal:attribute="href item.href" tal:content="item.title"></a>
        </li>
        <li tal:condition="not item.active" tal:attributes="class 
            'first' if repeat.item.start 
            else 'last' if repeat.item.end else None">
            <a tal:attribute="href item.href" tal:content="item.title"></a>
        </li>
    </tal:myloop>
</ul>

您可以多次使用
tal:define
定义类字符串的各个部分,然后从这些部分构造实际属性:


  • 这可能导致类属性为空,这是无害的


    至于其他文件;Chameleon是的一个实现,最初是为Zope页面模板开发的。因此,您会发现很多关于后者的文档也适用于变色龙,只要您考虑到变色龙的默认模式是
    python:
    ,而ZPT默认为
    path:
    。例如,Zope书的内容也适用于变色龙。

    在变色龙中,您可以执行以下操作:

    <ul>
        <li tal:repeat="item mainnav"
            class="${'first' if repeat.item.start else ''}
                   ${'last' if repeat.item.end else ''}
                   ${'active' if item.active else ''">
            <a tal:attributes="href item.href" tal:content="item.title">title</a>
        </li>
    </ul>
    
    [编辑] 或者像这样更好:

    <ul>
        <li tal:repeat="item mainnav"
            class="${('first ' if repeat.item.start else '') +
                     ('last ' if repeat.item.end else '') +
                     ('active' if item.active else '')}">
            <a tal:attributes="href item.href" tal:content="item.title">title</a>
        </li>
    </ul>
    

    关于这个问题,你有没有得到过一个好的答案,我还需要使用TAL将多个css样式附加到一个类中。对不起,没有。我最终切换到MAKO,甚至conisder,在不久的将来迁移到Jinja2。这似乎是一个麻烦的解决方案,因为你必须复制代码。如果有更多的可能性呢?我同意它是本可以解决我的问题,但必须有更好的解决方案?有效,但我必须在
    ${…}
    中直接使用
    项。
    而不是像
    repeat.item.
    中那样使用
    repeat