【问题标题】:printing calculated data in template在模板中打印计算数据
【发布时间】:2013-10-20 02:12:27
【问题描述】:

我无法找到将计算数据打印到模板的方法。我会尽力描述我的情况。我有一个名为 Dividend 的模型:

class Dividend(models.Model):
    date = models.DateField('pay date')
    amount = models.FloatField( validators=[MinValueValidator(0.001), MaxValueValidator(1000000000000000.0)])
    price = models.FloatField('price per share',
                              validators=[MinValueValidator(0.001), MaxValueValidator(1000000000000000.0)])

股息数据表如下所示:

Date    Dividend    Price
Sept. 26, 2013  $0.8    $24.75
June 26, 2013   $0.7    $24.74
March 26, 2013  $0.6    $23.59
Dec. 13, 2012   $0.4    $19.18
Sept. 26, 2012  $0.1    $20.66

我想添加每笔股息筹集方式的百分比(如果是的话)。所以是这样的:

Date    Dividend    Price
Sept. 26, 2013  $0.8 (+12,5%)   $24.75
June 26, 2013   $0.7 (+14,28%)  $24.74
March 26, 2013  $0.6 (+50%)     $23.59
Dec. 13, 2012   $0.4 (+300%)    $19.18
Sept. 26, 2012  $0.1            $20.66

我该怎么做?我在列表中有数据,因为我添加了一些我不想插入到数据库中的红利。所以我有一个股息对象列表。 基本上我想计算视图中的百分比变化并将其作为另一个参数添加到每个股息中。

for dividend in dividend_list:
    dividend.change = ...calculation...

而不是简单地将其添加到我的模板中

{% for dividend in stock.dividend_set.all|order_by:"date" %}
    <tr>
       <td>{{ dividend.date }}</td>
        <td>${{ dividend.amount }} ({{ dividend.change }}%)</td>
        <td>${{ dividend.price }}</td>
    </tr>
{% endfor %}

但是我做不到,因为Dividend中没有model字段变化。我存储在新的 QueryDict 中,其中键是股息.id 和值百分比变化。但我不能在模板中做 query_dict[dividend.id] 。那么最好的方法是什么?很抱歉问了这么一个微不足道的问题,但我不知道该寻找什么。很抱歉标题不满意,如果我在您的回复后想出更具描述性的内容,我会更改它。

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您可以向视图中的实例添加任意数据,而无需将它们作为模型字段。这很好:

    for dividend in dividend_list:
        dividend.change = ...calculation...
    

    只需确保将 dividend_list 传递给模板上下文即可。您使用的是基于类的视图还是功能视图?对于基于类的视图,在get_context_data 中执行此操作并将其添加到返回值。对于功能视图,将修改后的 dividend 列表(不再是惰性求值查询集)放入字典参数中:

        return render(template_name, {'dividend_list': dividend_list})
    

    然后在模板中对其进行迭代。

    {% for dividend in dividend_list %}
        <tr>
            <td>{{ dividend.date }}</td>
            <td>${{ dividend.amount }} ({{ dividend.change }}%)</td>
            <td>${{ dividend.price }}</td>
        </tr>
    {% endfor %}
    

    您也可以在股息模型上编写一个方法来进行计算,然后在模板循环中调用它,甚至可以编写一个自定义模板标签来显示股息。

    另外,你真的不想用FloatField 来代表金钱。请改用DecimalField

    【讨论】:

    • 谢谢!对不起,我在模板中使用数据库数据。这么愚蠢的错误。也感谢 DecimalField 的建议,我意识到为时已晚,我现在懒得重写它。但既然你也指出了这一点,我会的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多