Defines variables in the template.

It takes one or multiple semicolon-separated variable definitions.

Making a shortcut to a long path:

<div tal:define="destname path/to/existing/variable"></div>

Defining more than one variable at the same time:

<span tal:define="fname string:Paul; lname string:Dupond"></span>

Each definition may start with global keyword which makes variable available everywhere later in the template and all macros. Global variables can be redefined.

<span tal:define="global hello string:hello world"/>
<p tal:content="hello"/>

On the contrary, a local variable is only available inside the element it is defined in (and inside macros that are called in this element):

<span tal:define="hello string:hello world"/>
<p tal:content="hello"/> <!-- will produce an undefined variable error -->


You may also use tal:define with other attributes, it will be executed before any other attributes on the same element.

Creating a string inside the template:

<span tal:define="destname string:some string" />

Defining a string containing another variable:

<span tal:define="fname string:Paul; hello string:Hello $fname! Welcome to this page" />

A small trick which uses content of the element (useful if you need to define very complex value):

<span tal:define="global hello">Hello ${fname}! Welcome to this page</span>

In above example, the <span> tag won't show up because it has no printable content (hello variable grabs it) nor attributes.


This is a special case. It only works if you use the global keyword.