django模板系统,调用模型内的函数

guykilcj  于 2023-02-20  发布在  Go
关注(0)|答案(5)|浏览(107)

我想从我的模型中调用一个函数,比如:

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 %}

这不起作用,我可以调用一个不消耗任何东西的函数,但如果它有参数,我找不到该怎么做
干杯

q43xntqr

q43xntqr1#

不能使用模板中的参数调用函数。只能在视图中调用。或者,可以编写一个自定义模板过滤器,如下所示:

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

现在您可以在模板中执行以下操作:

{% for i in channel_status_list %}
  {{ i|related_deltas:3 }}
{% endfor %}
nukf8bse

nukf8bse2#

如果该方法不需要任何参数,则可以使用@property装饰器并在模板中正常访问它。

class ChannelStatus(models.Model):
    ...
    @property
    def function_you_want_as_property(self):
        mystring = ""
        ...
xurqigkl

xurqigkl3#

对于大于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)。

k4aesqcs

k4aesqcs4#

如果你发现到处都有太多的属性,或者你写的每一个方法都有一个模板过滤器,IRC上的thanks @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)
k3bvogb1

k3bvogb15#

另一个选项是定义属性。请参阅https://web.archive.org/web/20160407103752/http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
你可以编写一个可以做任何事情的函数,把它设为只读属性,从模板中调用该属性。
就这样!!!!

相关问题