Django fields for the prices module
Project description
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
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_prices-2.4.0.tar.gz.
File metadata
- Download URL: django_prices-2.4.0.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0aba1ece621afeabff1a55e84a80f412410e20bdf2183938a7bfaaa6cb14fa5c
|
|
| MD5 |
9ea37e397c684e63bfd76545f68ac2ce
|
|
| BLAKE2b-256 |
75d0236f9d97ef43c662c0b1b2f4d46a2dfc2f35070de44c987af87879a10aaf
|
Provenance
The following attestation bundles were made for django_prices-2.4.0.tar.gz:
Publisher:
publish.yml on mirumee/django-prices
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_prices-2.4.0.tar.gz -
Subject digest:
0aba1ece621afeabff1a55e84a80f412410e20bdf2183938a7bfaaa6cb14fa5c - Sigstore transparency entry: 652802890
- Sigstore integration time:
-
Permalink:
mirumee/django-prices@eb5dfe5595643a236e91df0838d56311fe6ab3d2 -
Branch / Tag:
refs/tags/2.4.0 - Owner: https://github.com/mirumee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb5dfe5595643a236e91df0838d56311fe6ab3d2 -
Trigger Event:
release
-
Statement type:
File details
Details for the file django_prices-2.4.0-py3-none-any.whl.
File metadata
- Download URL: django_prices-2.4.0-py3-none-any.whl
- Upload date:
- Size: 11.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c80e7a091d8f153214c457a6ab9ff17b037f934daa30551272c4009e813d05a9
|
|
| MD5 |
c636fb2a5d61bf79df26ed1eb86624ba
|
|
| BLAKE2b-256 |
e54cd9f6cf8a799b26c436546349ad9e7c6a9db95691e375b41cbe8fda58287d
|
Provenance
The following attestation bundles were made for django_prices-2.4.0-py3-none-any.whl:
Publisher:
publish.yml on mirumee/django-prices
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_prices-2.4.0-py3-none-any.whl -
Subject digest:
c80e7a091d8f153214c457a6ab9ff17b037f934daa30551272c4009e813d05a9 - Sigstore transparency entry: 652802911
- Sigstore integration time:
-
Permalink:
mirumee/django-prices@eb5dfe5595643a236e91df0838d56311fe6ab3d2 -
Branch / Tag:
refs/tags/2.4.0 - Owner: https://github.com/mirumee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb5dfe5595643a236e91df0838d56311fe6ab3d2 -
Trigger Event:
release
-
Statement type: