Skip to main content

Django fields for the prices module

Project description

django-prices: Django fields for the prices module

codecov PyPI - Version PyPI - Downloads PyPI - Python Version

Installation

  • pip install django-prices
  • Add django_prices to your INSTALLED_APPS at settings.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:

  1. In your forms:

    • remove the currency argument
    • add available_currencies with available choices.

    If the form specified MoneyFields in fields 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)
    
  2. In your models using MoneyField:

    • Replace all occurrences of the MoneyField class with DecimalField

    • Remove the currency argument from them

    • Change default from Money instance to value acceptable by Decimal field

      Example 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)
      
  3. In your migration files:

    • Replace all occurrences of the MoneyField class with DecimalField

    • Remove the currency argument from them

    • Change default from Money instance to value acceptable by Decimal field

      field = 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')
      
  4. Rename fields in models. Your old field will still store amount of money, so probably the best choice would be price_net_amount instead price_net.

  5. 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.

  6. Run python manage.py makemigrations. Make sure to do this step before adding new MoneyFields to model! If not, django will generate delete/create migrations instead of rename.

  7. Run python manage.py migrate.

  8. Update django-prices.

  9. Add models.CharField for currency and MoneyField 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")
    
  10. Run python manage.py makemigrations and python manage.py migrate.

  11. Change TaxedMoneyField declaration:

    price = TaxedMoneyField(
        net_amount_field="price_net_amount",
        gross_amount_field="price_gross_amount",
        currency="currency",
    )
    
  12. Remember to address changes in previously edited ModelForms


Crafted with ❤️ by Mirumee Software

hello@mirumee.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_prices-2.4.0.tar.gz (10.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_prices-2.4.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

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

Hashes for django_prices-2.4.0.tar.gz
Algorithm Hash digest
SHA256 0aba1ece621afeabff1a55e84a80f412410e20bdf2183938a7bfaaa6cb14fa5c
MD5 9ea37e397c684e63bfd76545f68ac2ce
BLAKE2b-256 75d0236f9d97ef43c662c0b1b2f4d46a2dfc2f35070de44c987af87879a10aaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_prices-2.4.0.tar.gz:

Publisher: publish.yml on mirumee/django-prices

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for django_prices-2.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c80e7a091d8f153214c457a6ab9ff17b037f934daa30551272c4009e813d05a9
MD5 c636fb2a5d61bf79df26ed1eb86624ba
BLAKE2b-256 e54cd9f6cf8a799b26c436546349ad9e7c6a9db95691e375b41cbe8fda58287d

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_prices-2.4.0-py3-none-any.whl:

Publisher: publish.yml on mirumee/django-prices

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page