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ページには表示されません。ドキュメントやコード行のコメントに役立ちます。