【问题标题】:Calling method of object in Django templateDjango模板中对象的调用方法
【发布时间】:2021-02-28 01:58:45
【问题描述】:

在 django 模板中调用非 Django 类的方法时遇到问题。

我尝试过将其作为属性调用并创建自定义过滤器,但我都无法返回任何内容。

抱歉,如果这很明显,但我并不精通 Django,而且我似乎在他们的文档中找不到任何非 Django 模型类的参考

我有一堂课

class MarketDataSet():
    def __init__(self, market_data):
        self.market_data = market_data

    def filter_data(self, side):
        filtered = list()
        for dp in self.market_data:
            if dp.side == side:
                filtered.append(dp)
        return filtered

    def bids(self):
        return self.filter_data(side='bid')

    def asks(self):
        return self.filter_data(side='bid')

    def trades(self):
        return self.filter_data(side='trade')

    def high_bid(self):
        amounts = list()
        if not self.bids():
            return ''
        else:
            for bid in self.bids():
                amounts.append(bid.amount)
            return max(amounts)

    def low_ask(self):
        amounts = list()
        if not self.asks():
            return ''
        else:
            for ask in self.asks():
                amounts.append(ask.amount)
            return max(amounts)

    def average_trade(self):
        amounts = list()
        if not self.trades():
            return ''
        else:
            for trade in self.trades():
                amounts.append(trade.amount)
            return statistics.mean(amounts)

和views.py(相关部分):

    if form.is_valid():
        style_id = form.get_style().upper()
        stats = dict()
        st_data = MarketDataSet(market_data=get_full_market_data(style_id=style_id, size=None))
        stats.update({'st': st_data})
        return render(request=request,
                      template_name='main/pricer_response.html',
                      context={'form': form,
                               'stats': stats,
                               })

和 pricer_response.html 模板(相关部分)注意这两种方法:

{% for platform in stats.keys %}
    {% block content %}
    {% load static %}
                    <tr>
                        <td><b>{{platform.title}}</b></td>
                        <td>{{stats.platform|get_method:high_bid}}</td>
                        <td>{{stats.platform.low_ask}}</td>
                    {% endfor %}
{% endblock %}

和 custom_tags.py:

@register.filter(name='get_method')
def get_method(obj, method_name):
    return getattr(obj, method_name)

【问题讨论】:

  • 也许你想将stats['st'] 传递为stats 键值(而不是stats)虽然我仍然不知道platform 属性来自哪里。

标签: python django class django-templates django-filters


【解决方案1】:

这更像是对如何访问 django 模板中的字典项的误解。解决方法如下:

            {% for platform, dataset in stats.items %}
            <tr>
                <td><b>{{ platform.title }}</b></td>
                <td>{{ dataset.high_bid }}</td>
                <td>{{ dataset.low_ask }}</td>

【讨论】:

    【解决方案2】:

    在你的 for 循环中,尝试像这样访问方法

    {{ stats[platform].method_to_call }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2018-10-02
      • 2020-04-10
      • 1970-01-01
      • 2010-11-24
      • 2016-11-17
      相关资源
      最近更新 更多