Мне нужно решение этой проблемы:
Я хотел бы иметь виджет 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
(также сохраняя флажки состояние во временных полях....). Считаю такую конструкцию очень слабой.
Форма должна работать как сама по себе, так и как встроенная (это означает, что значение поля, которое используется для вычисления возвращаемого значения, может или не может измениться при сохранении).
Такое вообще возможно?
И корень проблемы: я хочу хранить цены товаров в виде чистых цен, но я хотел бы разрешить пользователям вводить их в виде чистых или валовых цен, а затем пересчитывать валовую цену в чистую цену с учетом уровня налога на добавленную стоимость продукта ( поскольку НДС относится к товару или услуге, а не к цене). У продукта может быть много цен, поэтому цена связана с продуктом внешним ключом.
Привет, Томек