Djangoのテンプレート層

テンプレート層

Djangoのテンプレートは、テキスト文字列の一部です、役割は、パフォーマンスの文書やデータ領域を分離することです。テンプレートは、プレースホルダと、基本的なロジック(テンプレートラベル)を定義し、文書を表示する方法を指定します。一般的に、テンプレートはHTMLを生成するために使用されますが、Djangoのテンプレートは、任意のテキストベースのフォーマットを生成することができます。

フロントページに向けてDjangoテンプレートの方法を使用して、データの2つのバックエンドの転送があります。

第一种:以字典的形式传递数据
name = 'linwow'
return render(request,'index.html',{'name':name})

第二种:只能用在键和值的变量名相同的情况下,且会导入所以变量,即使不需要用到的也会被导入
name = 'linwow'
password = '123'
return render(request,'index.html',locals()) 

エレガントなテンプレートシステムは、このようなリスト、辞書、カスタムオブジェクトなどの複雑なデータ構造、たくさんのを扱うことができます。キーのDjangoテンプレートで複雑なデータ構造を横断することは、ドット(。)です。ナンバーインデックスは辞書のキー、属性、メソッド、またはオブジェクトポイントにアクセスすることができます。

view.py:
import datetime
def index(request):
    string = "hello linwow!"  # 字符串
    mylist = [111, 222, 333]  # 列表
    mydict = {"name": "linwow", "password": 123}  # 字典
    mydate = datetime.date(1999, 12, 30)  # 日期对象
    def func():
        return '你调用了我?'
    class Person(object):
        def __init__(self, name):
            self.name = name
        def func(self):
            return self.name
        @classmethod
        def index(cls):
            return 'cls'
        @staticmethod
        def bar(name, age):
            return 'bar'
    obj = Person("linwow")  # 自定义类对象
    return render(request, "index.html",locals())
    
index.html:
<p>我是传过来的字符串>>>{{string}}</p>
<p>我是传过来的列表>>>{{ mylist }}</p>
<p>我是传过来的列表中的索引2>>>{{ mylist.2 }}</p>
<p>我是传过来的字典>>>{{ mydict.name }}</p>
<p>我是传过来的日期>>>{{ mydate.year }}</p>
<p>我是传过来的函数>>>{{ func }}</p> # 后端传函数名到前端,会自动加括号调用,但是不支持传参
<p>我是传过来的类对象>>>{{ obj.name }}</p> # 后端传对象到前端,就相当于打印了这个对象
<p>我是传过来的类对象的类方法>>>{{ obj.index }}</p>
<p>我是传过来的类对象的静态方法>>>{{ obj.bar }}</p>

:フロントページには表示されません

{#调用python自带的内置方法,可以调用不需要传参的一些内置方法#}

フィルタ

テンプレートフィルターは変数を表示する前に変数の値を調整するための簡単な方法です。フィルタパイプ記号指定は、次のように
示されています。

{{ name|lower}}

ケーステキストを下げるために変換すること、及びその後、表示 - コードは、第一下部フィルタ{{名前}}変数の値によって調整されます。フィルタを直列に接続することができ、フィルタの出力、すなわち、次のフィルタに渡されます。

次の例では、リストの最初の要素を取得し、その後、大文字に変換します。

{{ my_list|first|upper}}

一部のフィルタは、パラメータを受け入れることができます。コロンのフィルタパラメータの後に、常に二重引用符インチ 例えば:

{{ bio|truncatewords:"30"}}

上記の例では、バイオ変数の最初の30ワードを示します。

ここで最も重要なフィルタのほんの一部です:

  • addslashes:バックスラッシュ、単一引用符と二重引用符の前にバックスラッシュ。文字列はエスケープするために使用することができます。例えば:{{ヴァルUE |にaddslashes}}。
  • 日付:書式文字列フォーマットされた日付または日時パラメータをオブジェクト(パーセント記号を追加しないでください)。例えば:{{ctimeの|日付: 'YM-D'}}。
  • 長さ:戻り値の長さ。リストには、それは要素の数を返します。文字列は、文字の数を返します。変数が定義されていない場合は、0を返します。
  • 値に加え、パラメータを追加します。例えば:{{値|追加: "2"}}の値が4の場合、出力6。
  • デフォルト値は、指定されたデフォルト値はfalseである場合は、値のそれ以外の場合は、値。例:{{値|デフォルト: "何も"}}
  • パラメータで指定されDictsortリストは、キーをソートソートされたリストを返す辞書を構成しました。例:{{値| dictsort: "名前"}}
  • 人間が読み取り可能なファイルサイズ(例えば、'13 KB「」4.1メガバイト「」102バイト、等)としてフォーマット値filesizeformat。例えば:{{値| filesizeformat}}値は、117.7メガバイトの出力123456789である場合。
  • 最初のリストの最初の要素を返します。
  • 最後のリストの最後の要素を返します。
  • 長さがTrueを返すlength_isパラメータの値に等しい場合、それ以外の場合はFalseを返します。例えば:{{値| length_is: "4"}}
  • 出力前に、さらにHTMLタグ文字列のない安全な脱出。この自動的に閉じエスケープフィルタは効果がありません。
  • スライスはリストのスライスを返します。Pythonのようなリストの構文をスライス。
  • 切り捨ては、文字列truncatechars文字列の指定した長さを超えています。省略記号の翻訳可能で終わる文字列の切り捨て(...)。例えば:{{値| truncatechars:9}}
  • truncatewordsスペース取らテキストによると、単語の指定された数の後の文字列を切り捨てます。

彼は強調しました:

前后端取消转义
前端:
	|safe
后端:
	from django.utils.safestring import mark_safe
	xxx = mark_safe('<h1>我是h1标签</h1>')

タグ

もし/他

値算出変数{%の場合%}コンテンツ(すなわち存在しないヌルではなく、偽の値)が真である場合、{%場合%}、システムがテンプレートを表示し、{%ENDIF%}の間です。例えば:

{% if today_is_weekend%}
<p>Welcome to the weekend!</p>
{% endif%}

{%さもなければ%}タグは任意です。

{% if today_is_weekend%}
<p>Welcome to the weekend!</p>
{% else%}
<p>Get back to work.</p>
{% endif%}

ラベルはまた、1つ以上の{%ELIFの%}句を有することができる場合。

{% if athlete_list%}
Number of athletes:{{ athlete_list|length}}
{% elif athlete_in_locker_room_list%}
<p>Athletes should be out of the locker room soon!</p>
{% elif...
...
{% else%}
<p>No athletes.</p>
{% endif%}

{%%の場合は}サポートし、又はしない試験以上の変数、又は抗指定された変数を取ります。同じタグに、同時に使用することができ、又は、この時点で、より高い優先順位より、または。あなたは括弧で示す必要がある場合の優先順位は、タグの場合、ネストされた使用する必要があります。逐次的な使用は、制御動作がサポートされていません括弧します。あなたは括弧を使用する必要性を感じた場合は、テンプレートの外にロジックの実行を検討した後、特殊なテンプレート変数を介して結果を渡します。あるいは、ネスト{%なら%}タグを直接使用します。

にとって

反復配列の各要素のタグ{%の%}。各反復で、テンプレートシステムは、{%用%}と{%ENDFOR%}の間でコンテンツをレンダリングします。{%%について}タグが入れ子にすることができます。

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

追加ラベルに反転し、イテレータのリストを逆:

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

{{%空%}}:コンテンツコードの{{%空%}の部分を歩いているとき、オブジェクトは自動的にループのための空の場合

book_list=[]

{% for foo in book_list %}
    {{ foo.name }}
    {% empty %}
        <p>你给我的容器类型是个空啊,无法for循环</p>
{% endfor %}

サイクルの終了前に、「ジャンプ。」することはできません これを行うために必要がある場合は、唯一の目標値の繰り返しを含む、反復処理する変数を変更します。同様に、いや文は、ループの先頭にすぐに戻ることができない「続けます」。内側のループでは{%の%}、テンプレートはforloopという名前の変数にアクセスすることができます。この変数は、あなたが彼らのプロセスを循環情報の一部を学ぶことができ、いくつかの属性があります。

  • Forloop.counter値は、整数であるサイクルの数を示します。1に等しいforloop.counter初めからこの属性の値は、そうループを介して初めて。
  • Forloop.revcounterは、残りのサイクル内の要素の数を表す整数値です。ループを介して初めて、配列内の要素の総数が通過するため、loop.revcounter値。ときに1の値forloop.revcounter最後のサイクル、。
  • forloop.revcounter0とforloop.revcounter同様の、しかしインデックスは、ゼロベースです。ループを介して初めて、FOR-loop.revcounter0配列マイナス1の要素の数値。ときに最後のサイクル、ゼロのforloop.revcounter0値。
  • forloop.firstはブール値、Trueに最初のループです。
  • forloop.lastはTrueにループをブール値、最後の時間です。

forloopタグはループ内でのみ使用可能です。場合テンプレートパーサ遭遇{%ENDFOR%}、消失forloop。

Djangoは{%ifequal%}タグを提供します。それらが等しい場合、{%Ifequalの%}タグは、2つの値を比較し、{%ifequal%} {%endifequal%}との間の表示内容。

テンプレートライブラリを作成します。

カスタムタグやフィルターかどうか、まず最初に、テンプレートライブラリを作成することです。テンプレートライブラリを作成するときには、3つのことを行う必要があります。

  • templatetagsという名前の新しいフォルダを作成するアプリケーションの名前で(その名前でなければなりません)。
  • Templatetagsは、2つの空のディレクトリにファイルを作成します(これはPythonコードを含むパッケージであることをPythonの)__ __ INIT PYと店舗カスタムラベル(フィルター)のファイルを、後者はラベルをロードするために使用される名前です。
  • 有効なタグライブラリモジュール層は値がtemplate.Libraryのインスタンスであるという名前の変数を、登録する必要があります。タグとフィルタは、このように登録されています。したがって、モジュールは、以下のコードの先頭に挿入します。
from django import template
register = template.Library()	

たとえば、カスタムラベル(フィルター)my_tag.pyでファイルを保存し、テンプレートでそうロードします:

{%負荷my_tagの%}

{%負荷%}文のロード指定のPythonモジュールではなく、アプリケーションです。

カスタムフィルタ

my_tag.py:
@register.filter(name='myadd')
def index(a,b):
	return a+b
	
index.html:
{% load my_tag %}
{{ 666|myadd:8 }}

カスタムラベル

my_tag.py:
@register.simple_tag
def plus(a,b,c):
	return a+b+c

index.html
{% load my_tag %}
{% plus 1 2 3 %}

カスタムinclusion_tag

my_tag.py:
@register.inclusion_tag('login.html',name='login')
    def login(n):
    	l = [ '第%s项'%i for i in range(n)]
    	return {'l':l}
    	
login.html:
<ul>
	{% for foo in l %}
	<li>{{ foo }}</li>
	{% endfor %}
</ul>

index.html
{% load my_tag %}
{% login 5 %}

継承とインポートテンプレート

テンプレートの継承

Djangoのテンプレートエンジンは継承されているテンプレートの最も強力で最も複雑な部分です。テンプレートの継承は、あなたのサイトのすべての要素が含まれている基本的な「スケルトン」テンプレートを作成することができます、そしてあなたはキルトのブロックをカバーすることができますテンプレートを定義することができます。

まず複数の領域に分割する必要があるテンプレートを継承

{% block 给区域起的名字 %}
	...
{% endblock %}

通常、テンプレートは、少なくとも3つを持っている必要があります

{% block css %}
	页面css代码块
{% endblock %}

{% block js %}
	页面js代码块
{% endblock %}

{% block content %}
	页面主体内容
{% endblock %}

ドーターボードは、テンプレートを継承しました

先继承模板所有的内容
{% extends 'home.html' %}
然后根据block块的名字修改指定区域的内容
{% block content %}
	<h1>登录页面</h1>
	<form action="">
	<p>username:<input type="text" class="form-control"></p>
	<p>password:<input type="text" class="form-control"></p>
	<input type="submit" class="btn btn-success">
	</form>
{% endblock %}

タグはここで重要である拡張し、それはこのテンプレートが別のテンプレートを「継承」というテンプレートエンジンに指示します。テンプレートシステムがこのテンプレートに対処するときは、まず親テンプレートを探します。

テンプレートのインポート:

別のHTMLを表示するいくつかの方法を導入するなどのHTMLモジュール

{% include '想导入的html文件名' %}

静的な設定ファイル

{% load static %}  

<link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式

Djangoテンプレート検出メカニズム: Djangoはテンプレートを探す(コード内だけで現在のアプリは、アプリテンプレートファイルに現在のフォルダ内で検索していない)、各アプリのテンプレートフォルダを見ての過程にあります。アプリテンプレートは、フォルダのリストを形成するたびに、Djangoは、ファイルのフォルダで見つかったときは停止し、すべてが指定されたテンプレートは、テンプレートで見つけることができません横切るように仕上がっている見つけるために、一つのフォルダで、リストを1を歩きます(Pythonパッケージを見つけると同様の処理)が見つかりませんでした。このような設計が有利コースです、欠点があり、有利な場所はアプリは害が間違っている可能性がある、他のアプリにテンプレートファイルを使用することができますです。だから我々はちょうど良いので、テンプレートフォルダに同じ名前のアプリを構築するために使用しているとき。

これは、テンプレートファイルのフォルダ内のすべてのアプリがアプリ/テンプレート/アプリ/ディレクトリのテンプレートに関連付けられたアプリケーション名、および唯一のアプリケーションを構築することが必要です

おすすめ

転載: blog.csdn.net/linwow/article/details/91463078