Django オンラインドキュメント和訳 更新しました。 Revision 5492 (2007/06/19). 「Django でのユーザ認証 - マネジャ関数」「テンプレートタグの概要 - iter_render()」「レンダリング速度を向上させるには」についての記述が更新されています。
以下、 diff -r 5468:5492 の主な変更分です。
- make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789') 指定した長さのランダムなパスワードを生成して返します.パスワードに使 える文字は文字列で指定します.(allowed_chars のデフォルト値は,ユー ザの見間違いを防ぐため i, I, l, o, 1, 0 を除 いてあります.)
テンプレートをコンパイルする時,Django は元のテンプレートテキストを「ノード (node)」に分割します.各ノードは django.template.Node のインスタンスで あり, render() または iter_render() メソッドを持ちます.コンパイル 済みのテンプレートは単なる Node オブジェクトの集まりに過ぎません.コン パイル済みのテンプレートオブジェクトに対して render() を呼び出すと,テ ンプレートは指定されたコンテキストを使ってノードリストの各 Node に対し て render() を呼び出します.戻り値は全て連結され,テンプレートからの出 力になります.
従って,カスタムテンプレートタグを定義するには,元のテンプレートタグをどう やって Node (コンパイル関数: compilation function) に変換し,個々のノー ドの render() メソッドや iter_render() メソッドが何をするかを指定す る必要があります.
新しいタグを実装する場合,たいていの実用的な目的なら Node に render() メソッドを持たせるのが簡単で十分な方法です.とはいえ, 巨大な文字列が生成されるようなテンプレートタグを作りたい場合, render() の代わりに iter_render() メソッドを使って逐次的にレンダリングを行った方 がレンダリング速度を向上でき (かつメモリ消費を抑えられ) ます.
iter_render() メソッドは,部分的な文字列を yield するイテレータか,部分 文字列の配列を返すようなメソッドとして実装します.テンプレートレンダラは, 部分文字列群を結合して,最終的な出力を生成します. render() メソッドに 対する利点は, Node 内の全てのレンダリング結果の入った巨大な文字列を一 度に生成する代わりに,より小さな部分文字列を生成できるということです.
例として,単にファイルの中身を返すような簡単な Node のサブクラスを示し ましょう
class FileNode(Node):
def __init__(self, filename):
self.filename = filename
def iter_render(self):
for line in file(self.filename):
yield line
このタグを使えば,巨大なファイルを操作する場合にファイルの全内容をメモリに 読み込む必要がなく,最適化の効果が生じます.
Node サブクラスの iter_render() メソッドを定義する場合, render() メソッドを定義する必要はありません.逆もまた然りです.デフォル トの Node.iter_render() メソッドの実装は,必要に応じて render() を 呼ぶだけの実装になっています.実は,この仕様のおかげでちょっと便利なおまけ があります.というのも,新しいタグを開発するときに,まずデバッグしやすいよ うに全出力を一度に生成するコードを render() に書いて,その後でメソッド をイテレータで書き直し,メソッド名を iter_render() に変えて,同じ出力を 得られるか調べればよいからです.
ただし, Node のサブクラスは render() か iter_render() の どちらか を実装せねばなりません.どちらのメソッドも省略すると,コードを import した際に TypeError が送出されます.
