Как в 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-вызовов к бэкенду.