Я думаю, что вы не должны смешивать логику приложения с шаблоном (представление в шаблоне 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 }}
Вы можете сделать это все более универсальным и создать класс Proxy, который имеет один метод (например, 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 }}