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 }}

您可以使这更加通用,并创建具有一个方法(例如get)的代理类,并在构造函数中采用一个参数:一个将请求对象作为第一个参数的函数。通过这种方式,您可以获得在模板中代理函数调用的通用方法。这里是:

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 回答