【问题标题】:How to calculate the difference between two context variables in Django template如何计算Django模板中两个上下文变量之间的差异
【发布时间】:2016-06-20 08:09:48
【问题描述】:

考虑一个模型:

class TempReport(models.Model):
    id = models.AutoField(primary_key=True)
    cost = models.FloatField()
    revenue = models.FloatField()
    # Some other fields not relevant to topic
    class Meta:
        managed = False
        db_table = 'temp_report'
        unique_together = (('sale_point', 'date'), ('id', 'sale_point'),)
        @property
        def net_income(self):
            return self.revenue - self.cost

我的目标是计算净收入 = 收入 - 成本 模板代码:

<tbody>
                {% for repdata in reporttable %}
                 <tr>
                    <td> {{ repdata.revenue }}</td>
                    <td> {{ repdata.cost }}</td>
                    <td> {{ repdata.net_income}}</td>
                 </tr>
                {% endfor %}
       </tbody>

...和视图

def tempreport(request):
    reporttable = TempReport.objects.values('id','cost','revenue')
    return render_to_response('report.html',
                            {'reporttable': reporttable},
                             context_instance = RequestContext(request))

即使没有出现错误消息,我也会得到一个空的 net_income。任何想法为什么这可能是由 引起的?

【问题讨论】:

    标签: django templates models


    【解决方案1】:

    在模型上创建属性应该可以工作。您的代码上的缩进不正确。该属性应该是模型类的方法,而不是 Meta 类。

    class TempReport(models.Model):
        id = models.AutoField(primary_key=True)
        cost = models.FloatField()
        revenue = models.FloatField()
        # Some other fields not relevant to topic
        class Meta:
            managed = False
            db_table = 'temp_report'
            unique_together = (('sale_point', 'date'), ('id', 'sale_point'),)
        @property
        def net_income(self):
            return self.revenue - self.cost
    

    在您看来,不要使用values(),因为这将返回字典而不是模型实例,并且您将无法访问该属性。

    from django.shortcuts import render
    
    def tempreport(request):
        reporttable = TempReport.objects.all()
    
        for r in reporttable:
            r.net_income = r.revenue - r.cost
        return render(request, 'report.html', {'reporttable': reporttable})
    

    请注意,我还更新了视图以使用 render 而不是过时的 render_to_response

    【讨论】:

    • 不,它对我不起作用。您能否根据我在问题中包含的视图包含该视图?
    • 你没有展示你的原始视图,所以我只能猜测问题是什么。你可能不应该使用values()
    • 我已经编辑了问题并为您添加了原始视图。
    • 好吧,如果我使用reporttable = TempReport.objects.all(),那么一切正常。有点跑题了,但是如果我使用objects.all(),我怎么能包含一个字段'sale_point__legal_entities__parent_id',它是一个由内部连接几个表生成的字段?
    • 您可以在外键后面加上{{ repdata .sale_point.legal_entities.parent_id }} 之类的东西。您可能会发现 select_related 对于减少查询数量很有用。我同意这是题外话,所以如果您有任何进一步的疑问,最好提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2019-09-02
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多