Система шаблонов django, вызывающая функцию внутри модели
Я хочу вызвать функцию из моей модели по шаблону, например:
class ChannelStatus(models.Model):
..............................
..............................
def get_related_deltas(self,epk):
mystring = ""
if not self.get_error_code_delta(epk):
return mystring
else:
for i in self.get_listof_outage():
item = i.error_code.all()
for x in item:
if epk == x.id:
mystring= mystring +" "+str(i.delta())
return mystring
И когда я хочу вызвать это из шаблона: предположим, во время рендеринга, я передаю channel_status_list как
channel_status_list = ChannelStatus.objects.all()
{% for i in channel_status_list %}
{{ i.get_related_deltas(3) }}
{% endfor %}
Это не работает, я могу вызвать функцию, которая ничего не потребляет, но не может найти, что делать, если у нее есть параметры
ура
5 ответов
Вы не можете вызвать функцию с параметрами из шаблона. Вы можете сделать это только в представлении. В качестве альтернативы вы можете написать собственный фильтр шаблона, который может выглядеть следующим образом:
@register.filter
def related_deltas(obj, epk):
return obj.get_related_deltas(epk)
Так что теперь вы можете сделать это в шаблоне:
{% for i in channel_status_list %}
{{ i|related_deltas:3 }}
{% endfor %}
Если метод не требует каких-либо аргументов, вы можете использовать декоратор @property и получить к нему обычный доступ в шаблоне.
class ChannelStatus(models.Model):
...
@property
def function_you_want_as_property(self):
mystring = ""
...
Для> 1 аргумента используйте простые теги:
@register.simple_tag
def related_deltas(obj, epk, second_arg):
return obj.get_related_deltas(epk, second_arg)
Шаблон:
{% for i in channel_status_list %}
{% related_deltas i 3 4 %}
{% endfor %}
(Обратите внимание на изменение синтаксиса от {{
в {%
)
Может принимать позиционные параметры (например, related_deltas i 3 second_arg=4 debug=true
).
Если вы обнаружите, что везде слишком много свойств, или у вас есть шаблонный фильтр для каждого другого написанного вами метода, было предложено другое решение для IRC благодаря @FunkyBob. Это немного хорошо, ну, прикольный, но в некоторых случаях это приятно.
class MethodProxy(object):
"""For consolidating into 1 method the calling of methods with various single args
(suitable dictionary keys)
class MyModel(models.Model):
...
def magic(self, value):
# Free the ponies
def thing(self):
return MethodProxy(self.magic)
# Usage
>>> m = MyModel()
...
>>> m.thing['value'] == m.magic('value')
# template
{{ m.thing.value }}
"""
def __init__(self, method):
self.method = method
def __getitem__(self, key):
return self.method(key)
Другим вариантом является определение свойства. См. http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/.
Вы пишете свою функцию, которая может делать практически все, что вы хотите. Вы делаете это свойство только для чтения. Вы звоните в собственность из шаблона.
И вуаля!!!!