Django-テンプレートシステム
Djangoを使用すると、PythonとHTMLを分離できます。Pythonはビューに、HTMLはテンプレートになります。2つをリンクするために、Djangoはレンダリング関数とDjangoテンプレート言語に依存しています。
レンダリング機能
この関数は3つのパラメータを取ります-
Request −最初のリクエスト。
The path to the template −これは、プロジェクトのsettings.py変数のTEMPLATE_DIRSオプションに関連するパスです。
Dictionary of parameters−テンプレートに必要なすべての変数を含む辞書。この変数を作成することも、locals()を使用してビューで宣言されたすべてのローカル変数を渡すこともできます。
Djangoテンプレート言語(DTL)
Djangoのテンプレートエンジンは、アプリケーションのユーザー向けレイヤーを定義するためのミニ言語を提供します。
変数の表示
変数は次のようになります:{{variable}}。テンプレートは、変数を、レンダリング関数の3番目のパラメーターのビューによって送信された変数に置き換えます。今日の日付を表示するようにhello.htmlを変更しましょう-
hello.html
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
</body>
</html>
その後、私たちの見方は-に変わります
def hello(request):
today = datetime.datetime.now().date()
return render(request, "hello.html", {"today" : today})
URL / myapp / helloにアクセスすると、次の出力が得られます。
Hello World!!!
Today is Sept. 11, 2015
お気づきかもしれませんが、変数が文字列でない場合、Djangoは__str__メソッドを使用して変数を表示します。同じ原則で、Pythonで行うのと同じようにオブジェクト属性にアクセスできます。例:日付年を表示する場合、変数は{{today.year}}になります。
フィルター
これらは、表示時に変数を変更するのに役立ちます。フィルタの構造は次のようになります:{{var | filters}}。
Some examples −
{{string|truncatewords:80}} −このフィルターは文字列を切り捨てるため、最初の80語のみが表示されます。
{{string|lower}} −文字列を小文字に変換します。
{{string|escape|linebreaks}} −文字列の内容をエスケープしてから、改行をタグに変換します。
変数のデフォルトを設定することもできます。
タグ
タグを使用すると、次の操作を実行できます:if条件、forループ、テンプレート継承など。
タグを付ける場合
Pythonの場合と同様に、テンプレートでif、else、elifを使用できます-
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
</body>
</html>
この新しいテンプレートでは、日付に応じて、テンプレートは特定の値をレンダリングします。
のタグ
'if'と同様に、Pythonの場合とまったく同じように機能する 'for'タグがあります。helloビューを変更して、リストをテンプレートに送信しましょう-
def hello(request):
today = datetime.datetime.now().date()
daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
{{for}}を使用してそのリストを表示するためのテンプレート-
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
</body>
</html>
そして、次のようなものを取得する必要があります-
Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun
タグのブロックと拡張
テンプレートシステムは、テンプレートの継承なしでは完成できません。つまり、テンプレートをデザインするときは、選択したタブに特別なcssが必要なページのように、子のテンプレートが自分のニーズに応じて埋める穴のあるメインテンプレートが必要です。
main_template.htmlから継承するようにhello.htmlテンプレートを変更してみましょう。
main_template.html
<html>
<head>
<title>
{% block title %}Page Title{% endblock %}
</title>
</head>
<body>
{% block content %}
Body content
{% endblock %}
</body>
</html>
hello.html
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
上記の例では、/ myapp / helloを呼び出すと、以前と同じ結果が得られますが、コードをリファクタリングするために、extendsとblockに依存しています。
main_template.htmlでは、タグブロックを使用してブロックを定義します。タイトルブロックにはページタイトルが含まれ、コンテンツブロックにはページのメインコンテンツが含まれます。home.htmlでは、extendsを使用してmain_template.htmlから継承してから、上記で定義したブロック(コンテンツとタイトル)を埋めます。
コメントタグ
コメントタグは、コメントをHTMLコメントではなくテンプレートに定義するのに役立ち、HTMLページには表示されません。ドキュメントやコード行のコメントに役立ちます。