02.Django-テンプレート

9884 ワード

Djangoのテンプレートの使い方の概要


1.テンプレートシステムの紹介


DjangoはWebフレームワークとして、テンプレートに必要なHTML出力静的部分と動的コンテンツ挿入
テンプレートはHTMLコードと論理制御コードで構成されています
Djangoフレームワークのテンプレート言語の構文形式:
{{var_name}}

たとえば、HTMLはpythonコードに直接符号化されます.
import datetime
def current_datetie(request):
	time1 = datetime.datetime.now()
	html="the time is $s."%time1
	
	return HttpResponse(html)

または、
>>> python manange.py shell		# django 
>>> from django.template import Context,Template
>>> t1=Template("hello {{name}}.")
>>> c1=Context({"name":"world"})
>>> t1.render(c1)
'hello world.'

同じテンプレートで複数のコンテキストを使用すると、テンプレートオブジェクトを作成して複数のコンテキストをレンダリングできます.
テンプレートを作成するとrender()メソッドレンダリングコンテキストを複数回呼び出すことができます

2テンプレートでサポートされる構文


構文の形式:
{{var_name}}

Djangoテンプレートの解析は、正規表現を一度に呼び出すことでバックグラウンドで行われます.

2.1深さの変数検索

python manage.py shell  # Django 

2.1.1アクセスリスト索引

>>> from django.template import Template, Context
>>> t1 = Template('hello {{ items.2 }}.')
>>> c1 = Context({'items': ['linux', 'javascript', 'python']})
>>> t1.render(c1)
'hello python.'

2.1.2辞書索引へのアクセス

>>> from django.template import Template,Context
>>> person = {"name":"Jack","age":22}
>>> t1 = Template("{{person.name}} is {{person.age}} years old.")
>>> c1 = Context({"person":person})
>>> t1.render(c1)
'Jack is 22 years old.'

2.1.3 datetime例

>>> from django.template import Template,Context
>>> import datetime
>>> day1=datetime.datetime.utcnow()
>>> day1.year
2017
>>> day1.month
8
>>> day1.day
20
>>> t1=Template("the month is {{ date.month }} and the year is {{ date.year }}")
>>> c1=Context({"date":day1})
>>> t1.render(c1)
'the month is 8 and the year is 2017'

2.1.4クラスの例

>>> class Person(object):
...     def __init__(self,first_name,second_name):
...             self.first_name=first_name
...             self.second_name=second_name
...
>>> t1=Template("hello,{{ person.first_name }}--{{ person.second_name }}.")
>>> c1=Context({"person":Person("Jack","Bones")})
>>> t1.render(c1)
'hello,Jack--Bones.'	

2.1.5参照先メソッド

>>> from django.template import Template,Context
>>> t1 = Template("{{var}}--{{var.upper}}--{{var.isdigit}}")
>>> t1.render(Context({"var":"Hello"}))
'Hello--HELLO--False'
>>> t.render(Context({"var":"666"}))
'666--666--True'

注意点:
 , 

2.2変数のフィルタ(filterの使用)


書式:
{{obj|filter:param}}

パラメータ:
add                  
addslashes           
capfirst			 
cut                  
date				 
default              False, , 
default_if_none      None, , 

例:
#value1="aBcDe"
{{ value1|upper }}# "ABCDE"

#value2=5
{{ value2|add:3 }}# 8

#value3='he  llo wo r ld'
{{ value3|cut:' ' }}# "helloworld"

#value4="hello world"
{{ value4|capfirst }}# "Hello world"

#import datetime
#value5=datetime.datetime.now()
{{ value5|date:'Y-m-d' }}# "2017-08-20"

#value6=[]
{{ value6 }}# "[]"
{{ value6|default:' ' }} # " "

#value7='click'
{{ value7 }}# "click"
{{ value7|safe }}
# , safe {{ value7|striptags }} {% autoescape off %} #Django , {{ value7 }} {% endautoescape %} #value8='1234' {{ value8|filesizeformat }} {{ value8|first }} {{ value8|length }} {{ value8|slice:":-1" }} #value9='http://www.baidu.com/?a=1&b=3' {{ value9|urlencode }} value9='hello I am Tony'

ラベル(tag)の使用(大かっことパーセンテージの組み合わせでtagの使用を表す)

2.3テンプレート言語の制御文


2.3.1{%if%}の使用


{%if%}ラベルは、「true」、すなわちfalseのboolean値が存在し、空ではなくfalseのboolean値である場合、変数値を計算します.
{%if%}と{%endif%}の間のすべてのコンテンツが表示されます.
例:
{% if num >= 100 and 8 %}
	{% if num > 200 %}
		

num 200

{% else %}

num 100 200

{% endif %} {% elif num < 100%}

num 100

{% else %}

num 100

{% endif %}

{%if%}ラベルは、複数の変数値をテストしたり、与えられた変数を否定したりするために単一and,orまたはnotを受け入れます.
{%if%}ラベルは、同じラベルにandとorを同時に表示することはできません.そうしないと、曖昧さが発生します.
たとえば、次のラベルは不正です.
{% if obj1 and obj2 or obj3 %}  

2.3.2{%for%}の使用


{%for%}ラベルは、シーケンス内の各要素を順番に巡回し、テンプレートシステムを循環するたびに{%for%}と{%endfor%}の間のすべての内容をレンダリングします.
例:
    {% for obj in list %}
  • {{ obj }}
  • {% endfor %}

ラベルにreversedを追加してリストを逆シーケンスできます.
{% for obj in list reversed %}
...
{% endfor %}

{%for%}ラベルはネストできます.
{% for country in countries %}
	

{{ country.name }}

    {% for city in country.city_list %}
  • {{ city }}
  • {% endfor %}
{% endfor %}

forループは割り込みループもcontinue文もサポートしません
{%for%}ラベルには、ループに関するプロパティを含むforloopテンプレート変数が内蔵されています.
forloop.counter          , 1 
forloop.counter0         forloop.counter, 0 
forloop.revcounter       ,revcounter , 1
forloop.revcounter0      ,revcounter , 0
forloop.first            , True, False	

例:
{% for item in todo_list %}
	

{{ forloop.counter }}: {{ item }}

{% endfor %} {% for object in objects %} {% if forloop.first %}
  • {% else %}
  • {% endif %} {{ object }}
  • {% endfor %}

    forloop変数はループでしか得られず,テンプレート解析器が{%endfor%}に達するとforloop変数は消失する
    テンプレートcontextにforloopという変数がすでに含まれている場合、Djangoは{%for%}ラベルで置き換えられます.
    Djangoは、開発者が定義したforloop変数の値をforラベルのブロックで上書きします.
    他の非循環の場所では、forloop変数は依然として使用できます.

    2.3.3 {% empty %}


    使用方法:
    {{li }}
    	  {%  for i in li %}
    		  
  • {{ forloop.counter0 }}----{{ i }}
  • {% empty %}
  • this is empty!
  • {% endfor %}

    2.3.4 {% csrf_token %} csrf_tokenラベル


    csrf_の生成に使用tokenのラベルは、クロスステーション攻撃の検証を防止するために使用されます.
    viewのindexでrender_を使っていたらto_responseメソッドは有効ではありません
    実はここではinputラベルを生成し、他のフォームラベルと一緒にバックグラウンドに提出します.

    2.3.5{%url%}#ルーティング構成のアドレスを参照


    2.3.6{%verbatim%}#render禁止


    使用方法:
    {% verbatim %}	#hello 
    	{{ hello }}
    {% endverbatim %}
    

    2.3.7{%load%}ラベルライブラリのロード


    2.3.8カスタムfilterとsimply_tag


    1、appでtemplatetagsモジュールを作成する
    2、任意を作成する.pyファイル、例えば:my_tags.py
    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()  # register , 
    
    @register.filter
    def custom_filter(x,y):
    	return x*y
    
    @register.simple_tag
    def custom_simple(x,y,z):
    	return x+y+z
    

    3、カスタムsimple_を使うtagとfilterのhtmlファイルにインポートする前に作成したmy_tags.py :{% load my_tags %}
    4、simple_を使うtagとfilter
    -------------------------------HTML 
    {% load xxx %}         #  ,xxx 
    
    
    
    	
    	Title
    
    
    	

    Hello {{ user.0 }}

    {{ user.3|custom_filter:8 }} {% custom_simple user.3 2 3 %}

    5、settingsのINSTALLED_APPSは現在のappを構成します.そうしないとdjangoはカスタムsimple_を見つけることができません.tag
    6、filterはifなどの文の後、simple_tag不可
    {% if num|filter_multi:30 > 100 %}
    	{{ num|filter_multi:30 }}
    {% endif %}
    

    2.4テンプレートの継承


    2.4.1 include(継承)テンプレートラベル


    {%include%}は、テンプレートに他のテンプレートの内容を含めることができる内蔵テンプレートラベルです.
    ラベルのパラメータは、含めるテンプレートの名前であり、変数であってもよいし、単一/二重引用符でハードコーディングされた文字列であってもよい.
    複数のテンプレートに同じコードが表示されるたびに、{%include%}を使用してコードの重複を減らすかどうかを考慮する必要があります.

    2.4.2 extend(継承)テンプレートラベル


    大規模なWebサイトでは、コンテンツが常に変化している地域があります.
    共通ページ領域による重複と冗長コードDjangoフレームワークでの使用を減らす方法はテンプレート継承です
    本質的には、テンプレート継承は、まずベースフレームテンプレートを構築し、サブテンプレートで共通部分と定義ブロックを再ロードすることです.
     :{% block title %}{% endblock %}    #  
     :{% extends "base.html" %}          #  , 
       {% block title %}{% endblock %}    #  
    	  {% csrf_token %}                   #  csrf 
       {% black.super %}
    	 {% include ' ' %}           # HTML , HTML 
    

    テンプレートで{%extends%}を使用する場合は、テンプレートの最初のテンプレートタグであることを保証する必要があります.そうしないと、テンプレートは機能しません.
    一般的には、ベーステンプレートにおける{%block%}のラベルが多ければ多いほど、サブテンプレートは必ずしも義父テンプレートのすべてのコードブロックを必要としないので、合理的なデフォルト値でいくつかのコードブロックを埋め込み、サブテンプレートに必要なコードブロックのみを再定義することができる.
    複数のテンプレート間のコードの再利用が多すぎる場合は、親テンプレートの{%block%}に重複コードセグメントを配置することも考えられる.
    親テンプレートのブロックの内容にアクセスする必要がある場合、{block.super}}ラベルを使用すると、この魔法変数は親テンプレートの内容を表現します.
    この魔法変数は、すべてをリロードするのではなく、上位コードブロックにコンテンツを追加したい場合に便利です.
    同じテンプレートに複数の同名の{%block%}を定義ことは許されない.
    blockタグの動作は双方向であるため、blockタグは親テンプレートにおいて{%block%}を定義する.
    親テンプレートに同じ名前の{%block%}ラベルが2つ表示されている場合、親テンプレートはどのブロックの内容を使用できません.