Преобразование данных в Джанго. Хотите иметь возможность применять суммы к десятичному полю - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть такая модель.

#models.py
class Payment(models.Model):
    unit_price = models.DecimalField(max_digits=12, decimal_places=2)
    discount = models.DecimalField(max_digits=12, decimal_places=2)
    payment_terms = models.CharField(max_length=80)
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    VAT = models.DecimalField(max_digits=4, decimal_places=2)

    def __unicode__(self):
        return unicode(self.unit_price)

class Invoice(models.Model):
    client = models.ForeignKey(Client)
    payment = models.ForeignKey(Payment)
    date = models.DateField()
    invoice_no = models.CharField(max_length=16)
    work_orders = models.ManyToManyField(Work_Order)
    contract_info = models.ForeignKey(Contract_Info)

    def __unicode__(self):
                return self.invoice_no

Я хочу сосредоточиться на оплате, поэтому постарайтесь забыть обо всем остальном.Вот мой views.py.

#views.py
@login_required 
def invoice_details(request, id=1):
    invoices_list = Invoice.objects.filter(pk=id)
    invoice = get_object_or_404(Invoice, pk=id)
    client = invoices_list[0].client
    work_orders = invoices_list[0].work_orders
    payment = invoices_list[0].payment

    return render_to_response(('invoice_details.html', locals()), {'work_orders': work_orders,'payment':payment,'client': client, 'invoice': invoice ,'invoices_list': invoices_list}, context_instance=RequestContext(request))

А вот мой шаблон.

<h1>invoice_details.html<h1>
{{ payment.amount }}

Шаблон отображает сумму платежа в десятичном виде.То, что я хочу сделать, это некоторые суммы с {{payment.amount}}.Предположим, что если бы я хотел умножить любое значение
{{payment.amount}} на, скажем, 2. Как бы я это сделал?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2010

Я не знаю, зачем вам это нужно делать внутри шаблона , а не в представлении, но вот мое решение. Существует длинное обсуждение арифметики в шаблонах Django о том, что эта функция не поддерживается специально для описанного вами варианта использования.

Если вы все еще хотите продолжить, это может помочь. В Django docs есть |add встроенный шаблонный фильтр , который кажется примитивной формой арифметики. К сожалению, |multiply фильтра нет. Вероятно, вы можете найти фильтр в template/defaultfilters.py под вашей установкой Django.

Скопируйте его, измените то, что вам нужно, чтобы сделать его продуктом, а не суммой. Когда вы закончите, вы можете захотеть отправить его в проект Django, чтобы сделать его встроенным в будущих выпусках.

0 голосов
/ 14 декабря 2010

Вот ответ:

#views.py
subtotal = payment.amount * 2
return render_to_response(('invoice_details.html', locals()), {'work_orders': work_orders,'payment':payment,'client': client, 'invoice': invoice ,'invoices_list': invoices_list, 'subtotal':subtotal}, context_instance=RequestContext(request))

В шаблоне поместите этот пользовательский тег (я думаю, что он есть) для представления значения.

{{ subtotal }}
0 голосов
/ 10 декабря 2010

Я бы сделал это в представлении,

new_amount = paymount.amount * 2
return render_to_response(('invoice_details.html', locals()), {'work_orders': work_orders,'payment':payment,'client': client, 'invoice': invoice ,'invoices_list': invoices_list, 'new_amount':new_amount}, context_instance=RequestContext(request))

Но если по какой-то причине вы не можете или не хотите этого делать, вы можете получить что-то похожее в шаблоне с помощью тегов шаблона. Я не думаю, что есть тэг умножения, но есть дополнение:

{{ payment.amount|add:"2" }}

Просто добавьте 2 к сумме платежа, аналогично

{{ payment.amount|add:payment.amount }}

Удвоит отображаемое значение. Добавление, вероятно, не совсем то, что вы хотели сделать, поэтому вы можете попытаться создать свой собственный шаблонный тег для использования умножения или любой другой функции, которую вы хотите, см. http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...