Package: django-prices
django-prices: Django fields for thepricesmoduleInstallationpip install django-pricesAdddjango_pricesto yourINSTALLED_APPSatsettings.pyFollowenmerkarinstructionsand update both yourINSTALLED_APPSandMIDDLEWARE_CLASSES.FeaturesProvides support for models:fromdjango.dbimportmodelsfromdjango_prices.modelsimportMoneyField,TaxedMoneyFieldclassModel(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:fromdjangoimportformsfromdjango_prices.formsimportMoneyFieldAVAILABLE_CURRENCIES=["BTC","USD"]classProductForm(forms.Form):name=forms.CharField(label="Name")price_net=MoneyField(label="net",available_currencies=AVAILABLE_CURRENCIES)And validators:fromdjangoimportformsfromprices.formsimportMoneyfromdjango_prices.formsimportMoneyFieldfromdjango_prices.validatorsimport(MaxMoneyValidator,MinMoneyValidator,MoneyPrecisionValidator)classDonateForm(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:{%loadprices%}<p>Price:{{foo.price.gross|amount}}({{foo.price.net|amount}}+{{foo.price.tax|amount}}tax)</p>You can also use HTML output frompricestemplate tags, they will wrap currency symbol in a<span>element:{%loadprices%}<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):<spanclass="currency">$</span>15.00How to migrate to django-prices 2.0Version 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 yourforms:remove thecurrencyargumentaddavailable_currencieswith available choices.If the form specifiedMoneyFieldsinfieldsoption, replace those with explicit declarations instead:AVAILABLE_CURRENCIES=[("BTC","bitcoins"),("USD","US dollar")]classModelForm(forms.ModelForm):classMeta:model=models.Modelfields=[]price_net=MoneyField(available_currencies=AVAILABLE_CURRENCIES)In yourmodelsusingMoneyField:Replace all occurrences of theMoneyFieldclass withDecimalFieldRemove thecurrencyargument from themChangedefaultfrom 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 yourmigrationfiles:Replace all occurrences of theMoneyFieldclass withDecimalFieldRemove thecurrencyargument from themChangedefaultfrom 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 inmodels. Your old field will still store amount of money, so probably the best choice would beprice_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.Runpython manage.py makemigrations. Make sure to do this step before adding newMoneyFieldsto model! If not, django will generatedelete/createmigrations instead ofrename.Runpython manage.py migrate.Updatedjango-prices.Addmodels.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")Runpython manage.py makemigrationsandpython manage.py migrate.ChangeTaxedMoneyFielddeclaration:price=TaxedMoneyField(net_amount_field="price_net_amount",gross_amount_field="price_gross_amount",currency="currency",)Remember to address changes in previously edited ModelForms