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


73

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

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

这是行不通的,我可以调用一个不消耗任何东西的函数,但是如果发现有参数,就无法找到该怎么办

干杯

Answers:


89

您无法使用模板中的参数调用函数。您只能在视图中执行此操作。另外,您可以编写一个自定义模板过滤器,看起来可能像这样:

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

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

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

您好,非常感谢您的备份!我收到“ related_deltas需要1个参数,提供了0个”错误。我完全按照你说的做。问候

嗯,应该可以。您可以发布完整的追溯(可能在dpaste.com之类的地方而不是这里)吗?
丹尼尔·罗斯曼

这似乎是一个不同的错误,可能是由中的双竖线字符引起的{{ forloop.parentloop.counter0||add:"5" }}
丹尼尔·罗斯曼

实际上在我的模板中,它是{{forloop.parentloop.counter0 | add:“ 5”}},将它显示为“ ||”真的很奇怪。

3
大家好,代码中定义了related_deltas函数在哪里?我收到名称错误:尝试将其放置在视图中时,未定义名称“注册”。
泰勒·布洛克

39

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

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

4
这不是问题所在,Django也可以无缝使用属性或方法,只要它们没有任何参数即可。
Danilo Cabello 2014年

12
@property不需要
laffuste

4
您可以在模板中添加使用示例吗?
Chicken Suop '18

7

对于> 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

如果发现到处都有太多属性,或者您编写的所有其他方法都具有模板过滤器,则在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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.