Runtime values
It is possible to define variables at runtime and to use them in the templates using the values
filter or the askama::get_value
function and to call the _with_values
variants of the render
methods. It expects an extra argument implementing the Values
trait. This trait is implemented on
a few types provided by the std
, like HashMap
:
use std::collections::HashMap;
let mut values: HashMap<&str, Box<dyn Any>> = HashMap::new();
// We add a new value named "name" with the value "Bibop".
values.insert("name", Box::new("Bibop"));
values.insert("age", Box::new(12u32));
The Values
trait is expecting types storing data with the Any
trait, allowing to store any type.
Then to render with these values:
template_struct.render_with_values(&values).unwrap();
There are two ways to get the values from the template, either by using the value
filter
or by calling directly the askama::get_value
function:
{% if let Ok(name) = "name"|value::<&str> %}
name is {{ name }}
{% endif %}
{% if let Ok(age) = askama::get_value::<u32>("age") %}
age is {{ age }}
{% endif %}
If you try to retrieve a value with the wrong type or that you didn't set, you will get an
Err(askama::Error::ValueType)
or a Err(askama::Error::ValueMissing)
.
Another example with a key-value tuple:
let value = "value".to_string();
let tuple: (&str, &dyn Any) = ("a", &value);
template_struct.render_with_values(&tuple).unwrap();
With this setup, only the "a"
key will return a value:
{% if let Ok(name) = "a"|value::<String> %}
a is {{ a }}
{% endif %}