Django模板系统中在模型内调用函数

80 投票
5 回答
92183 浏览
提问于 2025-04-15 13:52

我想在模板中调用我模型里的一个函数,像这样:

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 个回答

10

如果你有超过一个参数,可以使用 简单标签

@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)。

42

如果这个方法不需要任何参数,你可以使用@property装饰器,然后在模板中像平常一样访问它。

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

你不能在模板中直接调用带参数的函数。你只能在视图中这样做。另一种方法是你可以写一个自定义模板过滤器,它可能看起来像这样:

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

这样你就可以在模板中这样使用了:

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

撰写回答