Мультиполе и вычисляемое значение

Мне нужно решение этой проблемы:

Я хотел бы иметь виджет 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 (также сохраняя флажки состояние во временных полях....). Считаю такую ​​конструкцию очень слабой.

Форма должна работать как сама по себе, так и как встроенная (это означает, что значение поля, которое используется для вычисления возвращаемого значения, может или не может измениться при сохранении).

Такое вообще возможно?


И корень проблемы: я хочу хранить цены товаров в виде чистых цен, но я хотел бы разрешить пользователям вводить их в виде чистых или валовых цен, а затем пересчитывать валовую цену в чистую цену с учетом уровня налога на добавленную стоимость продукта ( поскольку НДС относится к товару или услуге, а не к цене). У продукта может быть много цен, поэтому цена связана с продуктом внешним ключом.

Привет, Томек


person tomek    schedule 07.09.2011    source источник


Ответы (1)


Функция, которую вы ищете в MultiValueField (позволяющая подполям быть обязательными или нет по отдельности), регистрируется как запрос функции на Django.

Возможно, вы могли бы исправить это на данный момент, создав подкласс MultiValueField с переписанным методом clean, основанным на исходном и следующих предложениях из отчета об ошибке. Однако к этому моменту у вас не останется много оригинального MultiValueField, и если вы это сделаете, вы должны отправить свой патч в Django и сделать примечание об ошибке.

Не обращая внимания на момент необходимости, вы написали метод compress для своего PriceDetailField? На что это похоже? Здесь вы должны проделать работу, чтобы превратить ваши четыре подполя в одно поле для сохранения.

person Duncan Parkes    schedule 07.09.2011
comment
Я прошел чистый метод MultiValueField и понял, что он вызывает сжатие. Итак, все, что нужно было сделать, это правильно реализовать метод сжатия. Теперь он возвращает вычисленное десятичное число (поскольку я связал всю форму с полем при построении, поэтому я могу получить доступ к полю, которое требуется для вычисления значения поля MVF), выдает ValidationError (если комбинация подполей недопустима) или возвращает None . Мне также пришлось переопределить метод _has_changed MultiWidget. Никакая логика поля не хранится в форме, за исключением передачи ссылки формы на поле. - person tomek; 08.09.2011
comment
Не могли бы вы указать, как можно получить доступ к подполям MultiValueField в шаблоне по отдельности? - person Cloud Artisans; 19.08.2013