English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Django テンプレートシステム

 DjangoはPythonとHTMLを分離して処理できるため、Pythonコード/変数はビューとHTMLテンプレートにいます。これらを結びつけるために、Djangoはレンダリング関数とDjangoテンプレート言語に依存しています。

レンダリング関数

この関数には3つの引数があります −

リクエストの初期化テンプレートパス − これはプロジェクトの settings.py ファイルの TEMPLATE_DIRS オプションに対する相対パスです。パラメータ辞書 − 辞書には、テンプレートに必要なすべての変数が含まれています。この変数は、ビューで宣言されたすべてのローカル変数を locals() で作成したり使用したりできます。

Djangoテンプレート言語(DTL)

Djangoテンプレートエンジンは、アプリケーションのユーザー層を定義するための小さな言語を提供しています。

変数の表示

変数は以下のように表示されます:{{variable}}. テンプレートは、ビューのrender関数の第3引数で送信される変数によって置き換えられます。hello.htmlを現在の日付に変更する方法を示しましょう:

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
<html> 
    <body>
       Hello World!!!<p>Today is {{today}}</p>
    </body> 
 </html>

その後、私たちのビューは以下のように変わります -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    return render(request, "hello.html", {"today": today})

今、URLにアクセスすると、以下のような出力が得られます /myapp/helloの後ろに−

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015

お分かりかもしれませんが、変数が文字列でない場合、Djangoは__str__メソッドを使用して表示し、同じ原則で、Pythonで使用するようにオブジェクトの属性にアクセスできます。例えば、日付の年を表示したい場合は、以下の変数を使用します:{{today.year}}.

フィルタ

これらのフィルタは、変数を変更したことを表示するのに役立ちます。フィルタの構造は以下のようになります:{{var|filters}}.

簡単な例で言えば −

{{string|truncatewords:8フィルタは文字列を切り取るため、前の部分しか見えません80个字符。

       {{string|lower}} − 转换字符为小写            {{string|escape|linebreaks}} − 转义字符串内容,然后换行转换为标签。    

还可以设置默认的变量。

标签

标签可以执行以下操作:if 条件,for循环,模板继承以及更多。

if标签

就像在Python中,你可以使用if,else和elif在模板中 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Today is {{today}}</p>
       We are
       {% if today.day == 1 }
       月の最初の日。
       {% elif today == 30 %}
       月の最終日。
       {% else %}
       I don't know.
       {% endif %}
    </body>
 </html>

在这个新的模板,根据当天的日期,该模板将呈现这个值。

for标签

就像'if',我们有 'for' 标签,这些完全像在Python中一样使用它们。让我们改变 hello视图列表发送到我们的模板 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
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 }} −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Today is {{today}}</p>
       We are
       {% if today.day == 1 }
       月の最初の日。
       {% elif today == 30 %}
       月の最終日。
       {% else %}
       I don't know.
       {% endif %}
       <p>
          {% for day in days_of_week %}
          {{day}}
       </p>
 
       {% endfor %}
    </body>
 </html>

我们应该得到输出的内容如下 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
Hello World!!!
 Today is Sept. 11, 2015
 We are I don't know.
 Mon
 Tue
 Wed
 Thu
 Fri
 Sat
 Sun

块和扩展标签

模板系统是不完整模板继承。当您设计模板的含义,子模板会根据自己的需要填写一个主模板,就像一个页面中所选选项卡可能需要一个特殊的CSS。

让我们修改 hello.html 模板来从 main_template.html 继承。

main_template.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
<html>
    <head> 
       <title>
          {% block title %}Page Title{% endblock %}
       </title> 
    </head>
 
    <body> 
       {% block content %}
          Body content
       {% endblock %} 
    </body>
 </html>

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
{% 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 }
 月の最初の日。
 {% elif today == 30 %}
 月の最終日。
 {% else %}
 I don't know.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

上記の例では、呼び出し中に /myapp/hello、前と同じ結果が得られますが、今は拡張を使用してコードをリファクタリングせずにやっています-−

main_template.html で、タグブロックを使用定義します。タイトルバーブロックにはページタイトルが含まれ、コンテンツブロックはページのメインコンテンツを含みます。Home.html で main_template.html から拡張を継承する場合、上記のブロック定義(コンテンツとタイトル)を使用します。

コメントタグ

コメントタグは、テンプレート定義のコメント用であり、HTML コメントではありません。これらは HTML ページに表示されません。これはファイルや一行のコードのコメントとして使用できます。