将提取的数据库字段发送到django模板

时间:2017-02-23 13:00:40

标签: django django-templates django-views

我的观点如下:

def traxio_advice(request):
      calculation_list = Calculations.objects.select_related('customer').filter(user=request.user)
      p = Paginator(calculation_list, 20)

      page = request.GET.get('page')
      try:
           calculations = p.page(page)
      except PageNotAnInteger:
           calculations = p.page(1)
      except EmptyPage:
           calculations = p.page(p.num_pages)

      context = {'calculations': calculations}
      return render(request, 'master/archive.html', context)

因此,我得到了这个用户的所有计算。并且计算模型具有price field,但价格独家增值税。它需要在数据库中存储独家增值税,但我需要显示包含增值税

因此,有没有办法计算每次计算的价格?

archive.html模板如下:

{% for calculation in calculations %}
      <tr data-archive-row class="archive-row">
           <td>
               <span>{{ calculation.make }}</span><br>
               <small >{{ calculation.model }}</small>
           </td>
           <td>
               <span class="text-success text-semibold">
                   {{ calculation.purchase_price|floatformat:0|intcomma }}
               </span>
               <small class="text-muted">(incl. VAT)</small>
           </td>
      </tr>
{% endfor %}

因此,在模板中显示价格独家增值税。

我创建了一个将其转换为包含增值税的功能:

def price_incl_vat(price_excl_vat):
    return (price_excl_vat * decimal.Decimal(settings.VAT_VALUE)).normalize()

有没有办法在视图中计算价格(调用函数),然后将其发送到模板,还是可以在模板中完成?

或者有更好的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

  1. 你问

      

    还是可以在模板中完成?

    是的,您可以创建custom template filter。在yourapp / templatetags / yourapp_tags.py

    import decimal
    
    from django import template
    from django.conf import settings
    
    register = template.Library()
    
    
    # add VAT
    @register.filter(name='add_vat')
    def add_vat(price_excl_vat):
        return price_excl_vat * decimal.Decimal(settings.VAT_VALUE)).normalize()
    

    然后在模板中

    {% load myapp_tags %}
    {% for calculation in calculations %}
        {{ calculation.purchase_price|add_vat }}
    {% endfor %}
    
  2. 或者,如果您希望这更多&#39;更多&#39;服务器端(模板过滤器仍然在我猜想的python代码中定义)你可以在模型上添加一个方法,以便它可以在更多的地方使用。

    class Calculation(models.Model):
        # more stuff here
    
        @property
        def price_including_vat(self):
            return self.purchase_price * decimal.Decimal(settings.VAT_VALUE)).normalise()
    

    然后它可以在任何地方使用,包括在calculation.price_including_vat模板中。

答案 1 :(得分:1)

您可以将price_incl_vat函数作为方法添加到模型中:

class Calculations(models.Model):
    # ... fields here ...

    def price_incl_vat(self):
        return (self.purchase_price * decimal.Decimal(settings.VAT_VALUE)).normalize()

然后您可以在模板中调用该方法:

<span>{{ calculation.price_incl_vat|intcomma }}</span>