ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Django テンプレートとは
Django テンプレートは、HTML と テンプレート構文を混在させて、動的な HTML を組み立てる仕組みです。プログラマでなくてもデザイナが触れるよう、Python の構文ではなく独自の DSL を採用しています。
配置と呼び出し
myapp/
├── views.py
├── models.py
└── templates/
└── myapp/
├── base.html
├── index.html
└── detail.html# myapp/views.py
from django.shortcuts import render
def index(request):
context = {
"title": "記事一覧",
"articles": Article.objects.all(),
"user_name": "taro",
}
return render(request, "myapp/index.html", context)
変数・フィルタ・タグの 3 構文
{# 1. 変数 #}
{{ title }}
こんにちは、{{ user_name }} さん
{# 2. フィルタ #}
{{ name|upper }}
{# 大文字 #}
{{ body|truncatechars:50 }}
{# 50 文字で切る #}
{{ price|floatformat:2 }}
{# 小数 2 桁 #}
{{ created_at|date:"Y-m-d H:i" }}
{# 日付フォーマット #}
{{ html|safe }}
{# エスケープ無効 (安全な場合のみ) #}
{{ var|default:"未設定" }}
{# null/空のときの代替値 #}
{# 3. タグ #}
{% if articles %}
{% for a in articles %}
- {{ a.title }}
{% endfor %}
{% else %}
記事はありません
{% endif %}
主要フィルタ一覧
| フィルタ | 用途 | 例 |
|---|---|---|
upper / lower | 大文字/小文字 | {{ s|upper }} |
title | 各単語の頭文字を大文字 | {{ s|title }} |
length | 長さ | {{ list|length }} |
truncatechars:N | N 文字で切る | {{ s|truncatechars:50 }} |
date:"Y-m-d" | 日付フォーマット | {{ dt|date:"Y-m-d" }} |
floatformat:N | 小数点 N 桁 | {{ p|floatformat:2 }} |
default:"-" | null/空時の代替 | {{ v|default:"-" }} |
safe | HTML エスケープを無効化 | {{ html|safe }} |
escape | HTML エスケープ | {{ s|escape }} |
linebreaks | 改行を / に | {{ s|linebreaks }} |
add:N | 加算 | {{ n|add:1 }} |
join:"," | 配列を結合 | {{ list|join:"," }} |
主要タグ一覧
{# for ループ #}
{% for a in articles %}
{{ forloop.counter }}: {{ a.title }}
{% empty %}
記事なし
{% endfor %}
{# if #}
{% if user.is_authenticated %}
ようこそ {{ user.username }} さん
{% elif user.is_anonymous %}
ゲストです
{% else %}
不明
{% endif %}
{# URL 逆引き #}
詳細
{# static ファイル #}
{% load static %}
{# パーシャル取り込み #}
{% include "myapp/_card.html" with article=a %}
{# コメント #}
{# 一行コメント #}
{% comment %}
ブロックコメント
複数行
{% endcomment %}
{# CSRF トークン (フォーム必須) #}
{# 変数定義 #}
{% with total=cart.items|length %}
カート: {{ total }} 件
{% endwith %}
テンプレート継承 (extends + block)
レイアウト共通化の必須テクニックです。
{# templates/base.html #}
{% block title %}サイト名{% endblock %}
{% load static %}
{% block extra_css %}{% endblock %}
{% include "_nav.html" %}
{% block content %}{% endblock %}
{% block extra_js %}{% endblock %}
{# templates/myapp/index.html #}
{% extends "base.html" %}
{% load static %}
{% block title %}記事一覧 | {{ block.super }}{% endblock %}
{% block extra_css %}
{% endblock %}
{% block content %}
記事一覧
{% for a in articles %}
- {{ a.title }}
{% endfor %}
{% endblock %}
カスタムタグ / カスタムフィルタ
# myapp/templatetags/myfilters.py
from django import template
register = template.Library()
@register.filter
def yen(value):
"""1234 → ¥1,234"""
return f"¥{value:,}"
@register.simple_tag
def current_year():
from datetime import date
return date.today().year
@register.inclusion_tag("myapp/_card.html")
def article_card(article):
return {"article": article}{# 利用側 #}
{% load myfilters %}
{{ price|yen }}
{# ¥1,234 #}
© {% current_year %} 会社名
{% article_card a %}
セキュリティ — エスケープ
Django テンプレートはデフォルトで HTML エスケープします:
{# context: {"user_input": ""} #}
{{ user_input }}
{# → <script>alert(1)</script> に変換され安全 #}
{{ user_input|safe }}
{# → そのまま
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
同階層のページ
- ビュー(View)
- テンプレート(Template)
- モデル(Model)
- ルーティングの作成
- viewからtemplateへの遷移方法