Мультиполе и вычисленное значение - PullRequest
1 голос
/ 07 сентября 2011

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

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

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

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


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

Ура, Томек

1 Ответ

0 голосов
/ 08 сентября 2011

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

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

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

...