English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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循环,模板继承以及更多。
就像在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>
在这个新的模板,根据当天的日期,该模板将呈现这个值。
就像'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 ページに表示されません。これはファイルや一行のコードのコメントとして使用できます。