Мне нужно решение этой проблемы:
Я хотел бы иметь виджет MultiField для поля «значение». Это поле должно позволять вводить два значения (два виджета ввода), и пользователь должен выбрать, какое из этих значений должно быть сохранено (два виджета-флажка). Однако одно из этих значений должно быть пересчитано относительно значения другого поля.
Я выбрал этот подход:
MultiValueField
с 4 полями:
class PriceDetailField(MultiValueField):
use_net = BooleanField(required=False)
net_value = DecimalField(required=False, decimal_places=2)
use_gross = BooleanField(required=False)
gross_value = DecimalField(required=False, decimal_places=2)
Мультивиджет:
class PriceDetailWidget(MultiWidget):
use_net = CheckboxInput()
net_value_widget = TextInput()
use_gross = CheckboxInput()
gross_value_widget = TextInput()
и пользовательская форма ...
class PriceModelForm(ModelForm):
value = PriceDetailField()
... который переопределяет стандартную форму модели для модели:
class Price(models.Model):
value = models.DecimalField(
max_digits=19,
decimal_places=2,
default=Decimal(0),
)
Однако это решение, похоже, испорчено. В форме мне нужно ввести все подполя (подполя MultiValueField
), в противном случае появляется ошибка «Пожалуйста, введите значение» (даже если эти поля помечены как required=False
). Также,
Я должен пересчитать указанное значение при сохранении, вернув кортеж из поля с информацией о том, какой флажок был отмечен, и соответствующее текстовое значение, а затем заменить кортеж десятичным значением в методе формы clean_value
(также сохраняя флажки состояние во временных полях ....). Я думаю, что такой дизайн очень слабый.
Форма должна работать как сама по себе, так и как встроенная (это означает, что значение поля, которое используется для вычисления возвращаемого значения, может или не может измениться во время сохранения).
Такое вообще возможно?
И корень проблемы: я хочу сохранить цены товаров как цены нетто, но я бы хотел, чтобы пользователи могли вводить их как цены нетто или брутто, а затем пересчитывать цену брутто в цену нетто с учетом НДС продукта уровень налога (поскольку НДС назначается на продукт или услугу, а не на цену). У продукта может быть много цен, поэтому цена связана с продуктом внешним ключом.
Ура,
Томек