django-prices: Django fields for the prices module
Installation
pip install django-prices- Add
django_pricesto yourINSTALLED_APPSatsettings.py
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
currencyargument - add
available_currencieswith available choices.
If the form specified
MoneyFieldsinfieldsoption, 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
MoneyFieldclass withDecimalField -
Remove the
currencyargument from them -
Change
defaultfrom 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
MoneyFieldclass withDecimalField -
Remove the
currencyargument from them -
Change
defaultfrom 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_amountinsteadprice_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 newMoneyFieldsto model! If not, django will generatedelete/createmigrations instead ofrename. -
Run
python manage.py migrate. -
Update
django-prices. -
Add
models.CharFieldfor currency andMoneyFieldto 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 makemigrationsandpython manage.py migrate. -
Change
TaxedMoneyFielddeclaration:price = TaxedMoneyField( net_amount_field="price_net_amount", gross_amount_field="price_gross_amount", currency="currency", )
-
Remember to address changes in previously edited ModelForms
Crafted with ❤️ by Mirumee Software
Metadata
Release files for django-prices 2.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_prices-2.4.0.tar.gz | 10.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_prices-2.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.8 kB
Release files / django_prices-2.4.0.tar.gz
| Download URL | django_prices-2.4.0.tar.gz |
|---|---|
| Size | 10.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0aba1ece621afeabff1a55e84a80f412410e20bdf2183938a7bfaaa6cb14fa5c
|
|
BLAKE2b-256 checksum How to use checksums |
75d0236f9d97ef43c662c0b1b2f4d46a2dfc2f35070de44c987af87879a10aaf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2025.
Transparency logRelease files / django_prices-2.4.0-py3-none-any.whl
| Download URL | django_prices-2.4.0-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c80e7a091d8f153214c457a6ab9ff17b037f934daa30551272c4009e813d05a9
|
|
BLAKE2b-256 checksum How to use checksums |
e54cd9f6cf8a799b26c436546349ad9e7c6a9db95691e375b41cbe8fda58287d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2025.
Transparency log