template python templates mako

python - template - Plantillas de Mako en línea if declaración



jinja2 (2)

Python es normal en línea si funciona:

<a href="#" ${''class="friend"'' if c.is_friend else ''''}>link</a>

Tengo una variable de plantilla, c.is_friend, que me gustaría usar para determinar si se aplica o no una clase. Por ejemplo:

if c.is_friend is True <a href="#" class="friend">link</a> if c.is_friend is False <a href="#">link</a>

¿Hay alguna forma de hacer esto en línea, como:

<a href="#" ${if c.is_friend is True}class="friend"{/if}>link</a>

¿O algo así?


Solución fácil

Podrías hacerlo así:

<a href="#" % if c.is_friend is True: class="friend" % endif >link</a>

ADVERTENCIA

¡Presta atención al {} dentro de ${} !

La solución con el operador ternario mencionado por Jochen también es correcta, pero puede conducir a un comportamiento inesperado cuando se combina con str.format() .

Debes evitar {} dentro de ${} Mako, porque aparentemente Mako deja de analizar la expresión después de encontrar la primera } . Esto significa que no deberías usar, por ejemplo:

  • ${''{}''.format(a_str)} . En su lugar, use ${''%s'' % a_str} .
  • ${''%(first)s %(second)s'' % {''first'': a_str1, ''second'': a_str2}} . En su lugar use
    ${''%(first)s %(second)s'' % dict(first=a_str1, second=a_str2)}

Solución general

Así que, por ejemplo, si necesitas encontrar una solución más general, digamos que necesitas poner una variable llamada relationship dentro de la etiqueta de clase en lugar de una cadena estática, puedes hacerlo así con el antiguo formato de cadena:

<a href="#" ${''class="%s"'' % relationship if c.has_relation is True else ''''}>link</a>

o sin formato de cadena:

<a href="#" % if c.has_relation is True: class="${relationship}" % endif >link</a>