Django fields for the prices module
Project description
django-prices: Django fields for the prices
module
Installation
pip install django-prices
- Add
django_prices
to yourINSTALLED_APPS
atsettings.py
- Follow
enmerkar
instructions and update both yourINSTALLED_APPS
andMIDDLEWARE_CLASSES
.
Features
Provides support for models:
from django.db import models
from django_prices.models import MoneyField, TaxedMoneyField
class Model(models.Model):
currency = models.CharField(max_length=3, default="BTC")
price_net_amount = models.DecimalField(max_digits=9, decimal_places=2, default="5")
price_net = MoneyField(amount_field="price_net_amount", currency_field="currency")
price_gross_amount = models.DecimalField(
max_digits=9, decimal_places=2, default="5"
)
price_gross = MoneyField(
amount_field="price_gross_amount", currency_field="currency"
)
price = TaxedMoneyField(
net_amount_field="price_net_amount",
gross_amount_field="price_gross_amount",
currency="currency",
)
And forms:
from django import forms
from django_prices.forms import MoneyField
AVAILABLE_CURRENCIES = ["BTC", "USD"]
class ProductForm(forms.Form):
name = forms.CharField(label="Name")
price_net = MoneyField(label="net", available_currencies=AVAILABLE_CURRENCIES)
And validators:
from django import forms
from prices.forms import Money
from django_prices.forms import MoneyField
from django_prices.validators import (
MaxMoneyValidator, MinMoneyValidator, MoneyPrecisionValidator)
class DonateForm(forms.Form):
donator_name = forms.CharField(label="Your name")
donation = MoneyField(
label="net",
available_currencies=["BTC", "USD"],
max_digits=9,
decimal_places=2,
validators=[
MoneyPrecisionValidator(),
MinMoneyValidator(Money(5, "USD")),
MaxMoneyValidator(Money(500, "USD")),
],
)
It also provides support for templates:
{% load prices %}
<p>Price: {{ foo.price.gross|amount }} ({{ foo.price.net|amount }} + {{ foo.price.tax|amount }} tax)</p>
You can also use HTML output from prices
template tags, they will wrap currency symbol in a <span>
element:
{% load prices %}
<p>Price: {{ foo.price.gross|amount:'html' }} ({{ foo.price.net|amount:'html' }} + {{ foo.price.tax|amount:'html' }} tax)</p>
It will be rendered as a following structure (for example with English locale):
<span class="currency">$</span>15.00
How to migrate to django-prices 2.0
Version 2.0 introduces major changes to how prices data is stored in models, enabling setting price's currency per model instance.
Steps to migrate:
-
In your forms:
- remove the
currency
argument - add
available_currencies
with available choices.
If the form specified
MoneyFields
infields
option, replace those with explicit declarations instead:AVAILABLE_CURRENCIES = [("BTC", "bitcoins"), ("USD", "US dollar")] class ModelForm(forms.ModelForm): class Meta: model = models.Model fields = [] price_net = MoneyField(available_currencies=AVAILABLE_CURRENCIES)
- remove the
-
In your models using
MoneyField
:-
Replace all occurrences of the
MoneyField
class withDecimalField
-
Remove the
currency
argument from them -
Change
default
from Money instance to value acceptable by Decimal fieldExample of code:
price_net = MoneyField( "net", currency="BTC", default=Money("5", "BTC"), max_digits=9, decimal_places=2 )
Updated code:
price_net = models.DecimalField("net", default="5", max_digits=9, decimal_places=2)
-
-
In your migration files:
-
Replace all occurrences of the
MoneyField
class withDecimalField
-
Remove the
currency
argument from them -
Change
default
from Money instance to value acceptable by Decimal fieldfield = django_prices.models.MoneyField(currency='BTC', decimal_places=2, default='5', max_digits=9, verbose_name='net')
Updated code:
field = models.DecimalField(decimal_places=2, default='5', max_digits=9, verbose_name='net')
-
-
Rename fields in models. Your old field will still store amount of money, so probably the best choice would be
price_net_amount
insteadprice_net
. -
All places which use Models and it's fields can prevent django app from even starting the code. Possible issues: code tries to access non existing fields. Exclude those fields for now from your ModelForms, Graphene types etc.
-
Run
python manage.py makemigrations
. Make sure to do this step before adding newMoneyFields
to model! If not, django will generatedelete/create
migrations instead ofrename
. -
Run
python manage.py migrate
. -
Update
django-prices
. -
Add
models.CharField
for currency andMoneyField
to your models:currency = models.CharField(max_length=3, default="BTC") price_net_amount = models.DecimalField("net", default="5", max_digits=9, decimal_places=2) price_net = MoneyField(amount_field="price_net_amount", currency_field="currency")
-
Run
python manage.py makemigrations
andpython manage.py migrate
. -
Change
TaxedMoneyField
declaration:price = TaxedMoneyField( net_amount_field="price_net_amount", gross_amount_field="price_gross_amount", currency="currency", )
-
Remember to address changes in previously edited ModelForms
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-prices-2.3.0.tar.gz
.
File metadata
- Download URL: django-prices-2.3.0.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | dc2ba039fcdeeffbcb8ba41e46821d509af4d50cca36f527990ed319ff83fed9 |
|
MD5 | 559a7f507d3d4cdbfbf0e70a2386ba79 |
|
BLAKE2b-256 | fb8d514f2caef68ec87124b8ec275be307bcc4771398257d1e43245dcfd201a4 |
File details
Details for the file django_prices-2.3.0-py3-none-any.whl
.
File metadata
- Download URL: django_prices-2.3.0-py3-none-any.whl
- Upload date:
- Size: 10.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b72ec33ac9475b8a2a8fff1414427b17fd6df58d8dfde4d257f7d58fd7251b80 |
|
MD5 | 90241ba14e199db224fdbf63075c62e9 |
|
BLAKE2b-256 | 2831e3d46a5f80bc0ed3d6ca516ece8fe889be28acbb4fac7af0f7c24cea0b2d |