46  Jinja: Basic

import jinja2

46.1 Template From String

environment = jinja2.Environment()
template = environment.from_string("Hello, {{ name }}!")
template.render(name="World")
'Hello, World!'
from jinja2 import Environment, FileSystemLoader
from datetime import datetime

# Set up the Jinja2 environment
# FileSystemLoader looks for templates in the specified directory
env = Environment(loader=FileSystemLoader("templates/"))
# Define a date filter
def date_filter(value, format="%Y-%m-%d"):
    """Format a date using strftime."""
    if isinstance(value, datetime):
        return value.strftime(format)
    return value

# Register the filter with your environment
env.filters['date'] = date_filter

# Load the template
template = env.get_template('example.html.j2')

# Define data for the template
data = {
    'title': 'Learning Jinja2',
    'heading': 'Welcome to Jinja2 Templates',
    'users': [
        {'name': 'Dr. Kittipos', 'role': 'Radiologist'},
        {'name': 'John', 'role': 'Developer'},
        {'name': 'Lisa', 'role': 'Data Scientist'}
    ],
    'is_admin': True
}

# Render the template with the data
result = template.render(**data)
# Write the result to a file
with open('out/output-ex.html', 'w') as f:
    f.write(result)

46.2 Template from file

46.2.1 Ex1: Message MD

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_name = "Python Challenge"
students = [
    {"name": "Sandrine",  "score": 100},
    {"name": "Gergeley", "score": 87},
    {"name": "Frieda", "score": 92},
    {"name": "Fritz", "score": 40},
    {"name": "Sirius", "score": 75},
]

environment = Environment(loader=FileSystemLoader("templates/"))
template = environment.get_template("message-temp.md.j2")
for student in students:
    filename = f"out/message_{student['name'].lower()}.md"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as f:
        f.write(content)
        print(f"... wrote {filename}")
... wrote out/message_sandrine.md
... wrote out/message_gergeley.md
... wrote out/message_frieda.md
... wrote out/message_fritz.md
... wrote out/message_sirius.md

46.2.2 Ex2: Result HTML

results_filename = "out/students_results.html"
results_template = environment.get_template("results.html.j2")
context = {
    "students": students,
    "test_name": test_name,
    "max_score": max_score,
}
with open(results_filename, mode="w", encoding="utf-8") as results:
    results.write(results_template.render(context))
    print(f"... wrote {results_filename}")
... wrote out/students_results.html

46.2.3 Ex3: Results MD

results_filename = "out/students_results.md"
results_template = environment.get_template("results.md.j2")
context = {
    "students": students,
    "test_name": test_name,
    "max_score": max_score,
}
with open(results_filename, mode="w", encoding="utf-8") as results:
    results.write(results_template.render(context))
    print(f"... wrote {results_filename}")
... wrote out/students_results.md