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>