gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:57:58 29 4
gpt4 key购买 nike

对不起或令人困惑的标题!它实际上比听起来简单得多。

我有一个函数:

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>在模板中而不是运行它。

最佳答案

我认为您不应该将应用程序逻辑与模板(MVC 模式中的 View )混合。这破坏了架构的一致性。您可以在需要它的 View 中调用 get_messages 并简单地将 messages 传递给模板上下文,在其他 View 中只需传递 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)的 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 }}

关于Django模板上下文函数不自动运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310789/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com