では、複数の商品をループで表示する「レシート風HTML」を Jinja2 で書いたサンプルを紹介します。これでテンプレートエンジンの強み(繰り返し処理や変数展開)がよく分かります。
Python側コード
from jinja2 import Template
# HTMLテンプレート(商品リストをループ表示)
template_str = """
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>レシート</title>
</head>
<body>
<h1>ご購入明細</h1>
<ul>
{% for item in items %}
<li>{{ item.name }}: {{ "{:,.0f}".format(item.price) }} 円</li>
{% endfor %}
</ul>
<p><strong>合計: {{ "{:,.0f}".format(total) }} 円</strong></p>
</body>
</html>
"""
# サンプルデータ
items = [
{"name": "りんご", "price": 120},
{"name": "みかん", "price": 300},
{"name": "バナナ", "price": 250},
]
# 合計計算
total = sum(item["price"] for item in items)
# テンプレートをレンダリング
template = Template(template_str)
html_output = template.render(items=items, total=total)
print(html_output)
Python出力されるHTML(例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>レシート</title>
</head>
<body>
<h1>ご購入明細</h1>
<ul>
<li>りんご: 120 円</li>
<li>みかん: 300 円</li>
<li>バナナ: 250 円</li>
</ul>
<p><strong>合計: 670 円</strong></p>
</body>
</html>
HTML💡 ポイント
{% for item in items %}で商品リストをループ処理。{{ "{:,.0f}".format(item.price) }}で桁区切りやフォーマットを指定。- データ(items, total)はPython側で計算してテンプレートに渡す。
これをさらに発展させて「日付や店舗名をヘッダーに表示する」などにすると、実際のレシートや請求書に近づきます。


