代码之家  ›  专栏  ›  技术社区  ›  Oli

Django模板上下文函数,但不自动运行

  •  2
  • Oli  · 技术社区  · 16 年前

    抱歉,还是标题太混乱了!其实比听起来简单多了。

    我有一个函数:

    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> 而不是运行它。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Dawid    16 年前

    我认为你不应该把应用程序的逻辑和模板(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 }}