将函数输出传递给Django过滤器

1 投票
1 回答
720 浏览
提问于 2025-04-16 21:29

我遇到一个情况,需要把一个函数的输出传递给Django的自定义过滤器。假设我们有一个对象:

class Money(object):
  def __init__(self, amount):
    self.amount = amount

class ConversionRate(object):

   def GetEuroRate(self):
      ... some calculation and return a float value.


   def GetGBPRate(self):
      ... some calculation and return a float value.


    ..... more functions.

我把钱和汇率的实例作为上下文变量传递过去。我想传递不同的汇率。在这个例子中,'money'和'conversion_rate'是上下文变量,分别指代Money对象和ConversionRate对象。

 {{ money|convert:conversion_rate.GetEuroRate }}

我的过滤器代码是:

@register.filter
def convert(first_value, second_value):
   """Returns the product to two numbers."""
    return float(first_value * float(second_value)

在我的自定义过滤器中,conversion_rate.GetEuroRate()总是返回0,而不是实际的值。有没有办法把函数的输出传递过去呢?

谢谢,

Kartik

1 个回答

2

我复制了你的类和过滤器,下面的代码对我来说是有效的:

#template_additions.py
from django import template
register = template.Library()

@register.filter
def convert(value, conversion_rate):
    return float(value * conversion_rate)

#models.py
class Money(object):
    def __init__(self, amount):
        self.amount = amount

class ConversionRate(object):
    def __init__(self, euro_rate):
        self.euro_rate = euro_rate

    def euro_rate(self):
        return float(self.euro_rate)

#views.py
from django.shortcuts import render
from your_app.models import Money, ConversionRate

def test(request):
    money = Money(amount=100)
    conversion_rate = ConversionRate(euro_rate=0.90)
    return render(request, 'test.html', {'money' : money,
         'conversion_rate' : conversion_rate})

#test.html
{% load template_additions %}
{{ money.amount|convert:conversion_rate.euro_rate }}

输出结果是:90

撰写回答