3

すみません、または紛らわしいタイトルです!実際には、思ったよりずっと簡単です。

私は機能を持っています:

def get_messages(request):
    # do something expensive with the request
    return 'string'

テンプレートからその関数を呼び出せるようにしたいので、コンテキスト プロセッサを組み込みました。

def context_processor(request):
    return {'messages':get_messages(request)}

だから今、私が{{messages}}自分のテンプレートを持っているとき、string印刷します。偉大な。

問題はget_messages、非常に高価であり、常に必要とされていないことです。テンプレートの半分未満がそれを必要とします。関数をテンプレートに渡し、実行するかどうかをテンプレートに任せる方法はありますか?

私はすでにこれを試しました:

def context_processor(request):
    return {'messages':get_messages}

ただし、それ<function get_messages at 0x23e97d0>はテンプレートを実行する代わりに、テンプレートに関数の説明を出力するだけです。

4

1 に答える 1

4

アプリケーションのロジックとテンプレート (MVC パターンのビュー) を混在させるべきではないと思います。これにより、アーキテクチャの一貫性が失われます。get_messagesそれを必要とするビューで呼び出して、単にmessagesテンプレート コンテキストに渡すことができます。他のビューでは単に渡すだけNoneです。

しかし、あなたの質問に答えると、プロキシ オブジェクトを作成できます。例えば:

class Proxy(object):
    def __init__(self, request)
        self.request = request
        super(Proxy, self).__init__()

    def get_messages(self):
        # so some expensive things
        return 'string'

# context processor
def context_processor(request):
    return {'messages':Proxy(request)}

# in the view
{{ messages.get_messages }}

これをより一般的なものにして、1 つのメソッド (例: get) を持ち、コンストラクターで 1 つのパラメーター (要求オブジェクトを最初のパラメーターとして受け取る関数) を取る Proxy クラスを作成できます。このようにして、テンプレートで関数呼び出しをプロキシするための汎用メソッドを取得します。ここにあります:

class Proxy(object):
    def __init__(self, request, function)
        self.request = request
        self.function = function
        super(Proxy, self).__init__()

    def get(self):
        return self.function(self.request)

次に、以前に書いたものよりもさらにクールに書くことができます。

# context processor
def context_processor(request):
    return {'messages':Proxy(request, get_messages)}

# sounds nice to me
{{ messages.get }}
于 2010-02-22T12:32:50.263 に答える