В проекте Django я использую пакет django-money .
Когда форма находится в режиме редактирования, мне нужно на лету изменить ее начальные значения в полях Money, если онипусты:
from djmoney.models.fields import MoneyField
DEFAULT_CURRENCY = 'EUR'
CURRENCIES_CHOICES = [
('EUR', 'Euro (EUR)'),
('USD', 'US Dollar (USD)'),
('GBP', 'Pound Sterling (GBP)')]
class ExampleModel(models.Model):
description = models.TextField(blank=True)
total_charged = MoneyField(max_digits=22,
decimal_places=7,
default_currency=DEFAULT_CURRENCY,
currency_choices=CURRENCIES_CHOICES,
null=True, blank=True)
class FormExampleEdit(forms.ModelForm):
class Meta:
model = ExampleModel
fields = ['description', 'total_charged']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.initial.get(total_charged, None) is None:
self.fields['total_charged'].initial = [None, 'USD']
A MoneyField состоит из двух полей (сумма и валюта).
При создании экземпляра FormExampleEdit
с экземпляром ExampleModel
(режим редактирования), если поле total_charged
равно None, тогда его начальное значение валюты будет установлено в 'EUR', то есть default_currency
, выбранное в поле модели.
В некоторых случаях эта валюта может зависеть от других факторов, поэтому, когда я создаю экземпляр формы с экземпляром ExampleModel, я проверяю, имеет ли экземпляр значение total_charged
, установленное на None
, в этом случае я манипулируюНачальное значение поля формы, чтобы установить его валюту на что-то другое, например, «USD».
Если я проверяю экземпляр формы, все должно работать, но каким-то образом при рендеринге формы доллары не выбираются, тогда выбирается валюта EUR.по умолчанию.
Я делаю нечто подобное в режиме создания (я не передаю экземпляр модели), и в этом случае это работает.Не знаю, что может вызвать это.