Django-template-system

提供:Dev Guides
移動先:案内検索

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