система шаблонов 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 как

  • Развертывание Django для Heroku (ошибка Psycopg2)
  • Django сортировать по расстоянию
  • Django Queryset: вставить поле VARCHAR в SQL перед фильтрацией
  • Как вы загружаете файл с запросом POST на django-tastypie?
  • как перебирать переменные postrequest в python
  • Django: перезапуск веб-сервера, чтобы изменения в исходном коде были применены
  •  channel_status_list = ChannelStatus.objects.all() {% for i in channel_status_list %} {{ i.get_related_deltas(3) }} {% endfor %} 

    Это не работает, я могу вызвать функцию, которая ничего не потребляет, но не может найти, что делать, если у нее есть параметр (ы)

    ура

  • Обслуживание безопасных страниц Django с помощью HTTPS
  • статический файл с mod_wsgi в django
  • Каков наилучший способ доступа к хранимым процедурам в ORM Django?
  • Django не распознает путь MEDIA_URL?
  • Как ограничить максимальное значение числового поля в модели Django?
  • Django - Создайте ZIP-файл из нескольких файлов и сделайте его загружаемым
  • 5 Solutions collect form web for “система шаблонов django, вызывающая функцию внутри модели”

    Вы не можете вызвать функцию с параметрами из шаблона. Вы можете сделать это только в представлении. Кроме того, вы можете написать собственный фильтр шаблонов , который может выглядеть так:

     @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 = "" ... 

    Если вы обнаружите, что во всем мире слишком много свойств, или у вас есть фильтр шаблонов для каждого другого метода, который вы пишете, другое решение было предложено в IRC благодаря @FunkyBob. Это немного хорошо, erm, фанки, но в некоторых случаях это хорошо.

      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) 

    Для аргументов> 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 ).

    Другой вариант – определить свойство. См. http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/ .

    Вы пишете свою функцию, которая может делать практически все, что вы хотите. Вы делаете это только для чтения. Вы вызываете свойство из шаблона.

    И вуаля !!!!

    Python - лучший язык программирования в мире.