Как в Django получить видимое значение по умолчанию для поля на основе двух полей, одного из той же модели и другого из другой модели?

Ниже представлены две мои модели:

class SomeThing(models.Model):
    name=models.ForeignKey(Name, on_delete=CASCADE)
    total_fee=models.DecimalField(max_digits=7, decimal_places=2, default=0)

class AnyThing(models.Model):
    name=models.ForeignKey(Name, on_delete=CASCADE)
    discount=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    net_fee=models.DecimalField(max_digits=7, decimal_places=2, default="Something.total_fee-discount")

Я хочу, чтобы чистая плата была видна пользователю в реальном времени, когда он заполняет форму. Поле должно вычислять чистую плату путем вычитания скидки в той же модели из общей платы в предыдущей. Есть ли какой-нибудь Django-путь для достижения этого?

Django form's добавляет атрибут id к каждому полю, как id_<name-of-the field>. Вы можете передать total_fee значение вашего экземпляра SomeThing в шаблон, и сделать вычисления с помощью простого javascript.

const PRICE = {{ total_fee }}

const outField = document.getElementById('id_net_fee')
const discountField = document.getElementById('id_net_fee')

discountField.addEventListener('keyup', () => {
  outField.value = PRICE - (parseFloat(discountField.value) || 0)
})

Чтобы передать значение total_fee, лучше всего сначала преобразовать его в строку, так как шаблоны могут форматировать его по-разному в зависимости от настроек локали.


return render(request, 'my-template.html', {
    # other stuff
    'total_fee': str(some_thing_instance.total_fee)
})

Если ваш total_fee зависит от Name значения, выбранного в выпадающем списке, вы можете добавить атрибут данных типа data-total_fee (см.: Как добавить data-attribute в django modelform modelchoicefield) и заменить PRICE const на data-total_fee значение выбранного элемента.

Во избежание ajax-вызовов к бэкенду.

Вернуться на верх