Make simple calculations in your django forms using django-calculation
. This app provide a Django Widget that derives its value from a expression defined in the widget instance.
The field is updated when any of the source fields change.
pip install django-calculation
INSTALLED_APPS = [
...
'calculation',
]
Import calculation
and complete the definition.
Using FormulaInput
widget
from django import forms
import calculation
class TestForm(forms.Form):
quantity = forms.DecimalField()
price = forms.DecimalField()
amount = forms.DecimalField(
widget=calculation.FormulaInput('quantity*price') # <- using single math expression
)
apply_taxes = forms.BooleanField(initial=True)
tax = forms.DecimalField(
# using math expression and javascript functions.
widget=calculation.FormulaInput('apply_taxes ? parseFloat(amount/11).toFixed(2) : 0.0')
)
django-calculation
works with static files and therefore it is necessary to include the media of the form in the template file.
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
{{ form.media }}
Currently the app support two modes of calculation FORMULA
and SUMMARY
.
FORMULA
The field value derive from a formula expression. In the expression you can refer to the form field using its name.
amount = forms.DecimalField(
widget=calculation.FormulaInput('quantity*price')
)
SUMMARY
The field value derive from a summary definition, it is useful when you need to get the sum of a django formset field.
total = forms.DecimalField(
widget=calculation.SummaryInput(
function=calculation.SUM,
field='amount'
)
Summary definition in OrderForm
class OrderForm(forms.ModelForm):
total = forms.DecimalField(
# using SumInput a SummaryInput abstraction
widget=calculation.SumInput('subtotal')
)
class Meta:
model = Order
fields = ['date', 'customer']
OrderDetForm
also contain a calculated field subtotal
.
class OrderDetForm(forms.ModelForm):
subtotal = forms.DecimalField(
widget=calculation.FormulaInput('quantity*price')
)
class Meta:
model = OrderDet
fields = ['product', 'price', 'quantity', 'subtotal']
# formset definition
OrderDetFormSet = forms.inlineformset_factory(Order, OrderDet, OrderDetForm)
- Create demo project.
- Create documentation.
Add changelog.