Latest web development tutorials

Djangoテンプレート

最後の章では、出力にdjango.http.HttpResponse()を使用しての "Hello World!"。 MVCを満たしていないデータは、ビューと一緒に混合される方法は、ジャンゴと思いました。

私たちはDjangoアプリケーションのテンプレートあなたに説明します。この章では、テンプレートは、プレゼンテーションやコンテンツ別の文書のテキストです。


テンプレートアプリケーション例

私たちは、プロジェクトの前のセクションでは、HelloWorldのディレクトリテンプレートディレクトリの下に作成し、hello.htmlファイルを確立され、その後、全体のディレクトリ構造は以下の通りです。

HelloWorld/
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   |-- view.py
|   |-- view.pyc
|   |-- wsgi.py
|   `-- wsgi.pyc
|-- manage.py
`-- templates
    `-- hello.html

hello.htmlファイルコードは次のとおりです。

<h1>{{ hello }}</h1>

私たちは、二重括弧を使用するようにテンプレート変数から知っています。

次に、テンプレートに[BASE_DIR + "/テンプレート」、にDIRSを変更し、パスDjangoのテンプレートファイルを説明したHelloWorld / settings.pyを修正する必要があり、]次のように:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR+"/templates",],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

現在のテンプレートにデータを送信するために、新しいオブジェクトを追加し、view.pyを変更します。

# -*- coding: utf-8 -*-

#from django.http import HttpResponse
from django.shortcuts import render

def hello(request):
    context          = {}
    context['hello'] = 'Hello World!'
    return render(request, 'hello.html', context)

私たちは、私たちが代わりに使用前のHttpResponseをレンダリングここで使用していることがわかります。 また、パラメータとして辞書コンテキストを使用しレンダリングします。

コンテキスト辞書のキー要素「ハロー」は、テンプレート内の変数 "{{こんにちは}}」に相当します。

次に訪問http://192.168.45.3:8000/hello/を訪れ、ページを見ることができます:

その後、我々は、データビューの分離を可能にする、出力データを使用するテンプレートを完了しました。

次に、我々は共通のテンプレート構文規則をご紹介します。


Djangoのテンプレートタグ

場合/他のタグ

次のように基本的な構文は次のとおりです。

{% if condition %}
     ... display
{% endif %}

または:

{% if condition1 %}
   ... display 1
{% elif condiiton2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

出力か否かを決定するための条件に従って。 場合/他には、ネストされたサポートしています。

{%%場合}タグは、例えば、(いない)を受け取り、またはかどうか、複数の変数へのキーワードの判断をするために、または変数が否定:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的。
{% endif %}

ラベルの

{%の%は}私たちが列を反復処理することができます。

そして、同様の文に対するPythonの場合、ループ構文はYでX用で、Yは、以上のループと配列であり、Xは、それぞれ特定のサイクルで使用される変数名です。

ループを通るたびに、テンプレートシステムは、間、すべての{%%のために} {%ENDFOR%}コンテンツをレンダリングします。

たとえば、変数athlete_list選手のリストを考えると、我々はこのリストを表示するには、次のコードを使用することができます。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

リバースイテレータように逆転されるリストを追加するレーベル:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

あなたは{%%のため}タグを入れ子にすることができます:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

ifequal / ifnotequalタグ

{%Ifequalの%}タグは、2つの値を比較し、それらが等しいとき、{%ifequal%}のすべての値を表示し、{%endifequal%}です。

次の例では、テンプレート変数のユーザーと2あるCurrentUserを比較します。

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

そして、{%は%であれば}同様に、{%ifequal%}はオプションの{%それ以外%}タグをサポートしています。8

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}

[メモ]タブ

Djangoは注釈{##}を使用。

{# 这是一个注释 #}

フィルタ

テンプレートフィルタはそれを変更する前に、変数に表示することができ、フィルタパイプ文字、次のように

{{ name|lower }}

{{名前}}変数下部フィルタ処理された後、大文字小文字にテキストを変換する文書。

フィルタパイプソケットの両方が出力フィルタパイプ言うと次のパイプラインへの入力として使用することができ、*であることができます。

{{ my_list|first|upper }}

上記の例の最初の要素と大文字に変換します。

一部のフィルタパラメータを持っています。 フィルタパラメータは、コロンと常に二重引用符が続いた後。 例えば:

{{ bio|truncatewords:"30" }}

この変数は、バイオの最初の30語を表示します。

その他のフィルタ:

  • addslashes:任意の単一引用符または二重引用符の前にバックスラッシュバックスラッシュを追加します。
  • 日付:書式文字列引数のフォーマットを指定した日付またはdatetimeオブジェクトのインスタンスを押します:
    {{ pub_date|date:"F j, Y" }}
  • 長さ:変数の長さを返します。

タグを含めます

{%は%を含め}タグは、テンプレート内のテンプレートが含まれている他のコンテンツを許可します。

次の2つの例は、nav.htmlテンプレートが含まれています。

{% include "nav.html" %}

テンプレートの継承

テンプレートは、多重化を達成する方法を継承することができます。

次に、以下のように我々は、base.htmlプロジェクトファイルを追加する前に、テンプレートのディレクトリを作成します。

<html>
  <head>
    <title>Hello World!</title>
  </head>

  <body>
    <h1>Hello World!</h1>
    {% block mainbody %}
       <p>original</p>
    {% endblock %}
  </body>
</html>

上記のコードは、メインボディという名前のブロックタグは、部品を交換する後継者とすることができるということです。

すべての{%block%}タグは子テンプレートがこれらの部品を上書きすることができますテンプレートエンジンに指示します。

hello.htmlはbase.htmlを継承し、特定のブロックを交換する、として修正されたコードhello.htmlは次のとおりです。

{% extends "base.html" %}

{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}

コードの1行目では、hello.htmlはbase.htmlファイルを継承して示しています。 我々はbase.html対応するブロックを置き換えるために、ここで、ブロックタグの同じ名前を見ることができます。

次のようにアドレスhttp://192.168.45.3:8000/hello/を再訪、出力結果は次のとおりです。