Django-テンプレートシステム
Djangoでは、PythonとHTMLを分離できます。Pythonはビューに、HTMLはテンプレートに含まれます。 2つをリンクするために、Djangoはrender関数とDjangoテンプレート言語に依存しています。
レンダリング関数
この関数は3つのパラメータを取ります-
- リクエスト-最初のリクエスト。
- テンプレートへのパス-これは、プロジェクトのsettings.py変数のTEMPLATE_DIRSオプションに関連するパスです。
- パラメータの辞書-テンプレートで必要なすべての変数を含む辞書。 この変数を作成するか、locals()を使用して、ビューで宣言されたすべてのローカル変数を渡すことができます。
Djangoテンプレート言語(DTL)
Djangoのテンプレートエンジンは、アプリケーションのユーザー向けレイヤーを定義するミニ言語を提供します。
変数の表示
変数は次のようになります:\ {\ {variable}}。 テンプレートは、render関数の3番目のパラメーターで、ビューによって送信された変数で変数を置き換えます。 今日の日付を表示するようにhellolを変更しましょう-
こんにちは
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
</body>
</html>
その後、私たちの見解は変わります-
def hello(request):
today = datetime.datetime.now().date()
return render(request, "hellol", {"today" : today})
URL/myapp/helloにアクセスした後、次の出力を取得します-
Hello World!!!
Today is Sept. 11, 2015
お気付きかもしれませんが、変数が文字列でない場合、Djangoはstrメソッドを使用して表示します。同じ原理で、Pythonで行うのと同じようにオブジェクト属性にアクセスできます。 たとえば、日付の年を表示する場合、変数は\ {\ {today.year}}になります。
フィルター
表示時に変数を変更するのに役立ちます。 フィルター構造は次のようになります:\ {\ {var | filters}}。
いくつかの例-
- \ {\ {string | truncatewords:80}} -このフィルタは文字列を切り捨てるため、最初の80語のみが表示されます。
- \ {\ {string | lower}} -文字列を小文字に変換します。
- \ {\ {string | escape | linebreaks}} -文字列の内容をエスケープし、改行をタグに変換します。
変数のデフォルトを設定することもできます。
Tags
タグを使用すると、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」と同様に、「for」タグがあります。これはPythonとまったく同じように機能します。 こんにちはビューを変更して、テンプレートにリストを送信しましょう-
def hello(request):
today = datetime.datetime.now().date()
daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return render(request, "hellol", {"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が必要なページのように、子供のテンプレートが自分の必要に応じて埋める穴のあるメインテンプレートが必要です。
hellolテンプレートをmain_templatelから継承するように変更してみましょう。
*main_templatel*
<html>
<head>
<title>
{% block title %}Page Title{% endblock %}
</title>
</head>
<body>
{% block content %}
Body content
{% endblock %}
</body>
</html>
こんにちは
{% extends "main_templatel" %}
{% 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を呼び出すと、以前と同じ結果が得られますが、コードをリファクタリングするためにextendとblockに依存しています-
main_templatelでは、タグブロックを使用してブロックを定義します。 タイトルブロックにはページタイトルが含まれ、コンテンツブロックにはページのメインコンテンツが含まれます。 homelでは、main_templatelから継承するためにextendsを使用してから、上記のブロック定義(コンテンツとタイトル)に入力します。
コメントタグ
コメントタグは、HTMLコメントではなくテンプレートにコメントを定義するのに役立ちます。HTMLページには表示されません。 ドキュメント化やコード行のコメント化に役立つ場合があります。