Djangoフレーム内のメソッドのアクセスと検索

3652 ワード

Djangoテンプレートで複雑なデータ構造を巡る鍵はピリオド(.)です.
いくつかの例で説明したほうがいいです.たとえば、Python辞書をテンプレートに渡すとします.辞書キーを使って辞書の値にアクセスするには、ピリオドを使ってもいいです.

>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'Sally is 43 years old.'

同様に、ドットを通してオブジェクトの属性にアクセスすることもできます.例えば、Pythonのdatetime.dateオブジェクトはyear、month、dayのいくつかの属性があります.テンプレートの中で句点を使ってこれらの属性にアクセスできます.

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The month is 5 and the year is 1993.'

この例は、任意のオブジェクトに適用されるカスタムクラスを使用して、インスタンス変数プラスポイント(dots)によってその属性にアクセスすることを実証した.

>>> from django.template import Template, Context
>>> class Person(object):
...  def __init__(self, first_name, last_name):
...   self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
u'Hello, John Smith.'

点文法は、オブジェクトの*メソッド*を参照するためにも使用できます.例えば、各Python文字列にはuper()とisdigit()の方法があり、テンプレートでは同じシンタックスを使ってそれらを呼び出すことができます.

>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'

注意ここでメソッドを呼び出すときは*かっこを使っていません.また、パラメータを渡すこともできません.パラメータを必要としない方法しか呼び出しられません.(この章で設計観を後で説明します.)
最後に、ピリオドもリストインデックスにアクセスするために使用できます.例えば、

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'

負のリストインデックスは使用できません.このようなテンプレート変数は`TemplateSyntxError`を誘発します.
Pythonリストの種類
ヒント:Pythonのリストは0からインデックスを開始します.1番目の索引は0で、2番目の項目は1で、これに類推します.
句点検索規則は、一般的には、テンプレートシステムが変数名でポイントに遭遇した場合、以下の順序で検索を試みることができます.
  •     辞書タイプの検索(例えば、foo[bar])
  •     属性検索(例えば、foo.bar)
  •     メソッド呼び出し(例えば、foo.bar()
  •     リストタイプインデックス検索(例えば、foo[bar])
  • システムは見つかった最初の有効なタイプを使います.これは短絡論理です.
    ピリオド検索は、マルチレベルの深さネスティングが可能です.例えば、以下の例では、{person.name.uper}が辞書タイプに変換されて検索され、その後に方法が呼び出されます.
    
    >>> from django.template import Template, Context
    >>> person = {'name': 'Sally', 'age': '43'}
    >>> t = Template('{{ person.name.upper }} is {{ person.age }} years old.')
    >>> c = Context({'person': person})
    >>> t.render(c)
    u'SALLY is 43 years old.'