система шаблонов django, вызывающая функцию внутри модели - PullRequest
61 голосов
/ 26 августа 2009

Я хочу вызвать функцию из моей модели по шаблону, например:

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 ]

81 голосов
/ 26 августа 2009

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

@register.filter
def related_deltas(obj, epk):
    return obj.get_related_deltas(epk)

Так что теперь вы можете сделать это в шаблоне:

{% for i in channel_status_list %}
  {{ i|related_deltas:3 }}
{% endfor %}
34 голосов
/ 13 ноября 2012

Если метод не требует каких-либо аргументов, вы можете использовать декоратор @property и получить к нему доступ в шаблоне.

class ChannelStatus(models.Model):
    ...
    @property
    def function_you_want_as_property(self):
        mystring = ""
        ...
6 голосов
/ 03 июля 2015

Для> 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).

5 голосов
/ 30 декабря 2010

Если вы обнаружите, что везде слишком много свойств, или у вас есть шаблонный фильтр для каждого другого написанного вами метода, было предложено другое решение для 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)
2 голосов
/ 30 августа 2010

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

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

Et voilà !!!!

...