Uncaught TypeError: Невозможно прочитать свойства неопределенного (чтение 'amount')
Я преобразовал модели Django в объект данных JSON и обратился к нему в Javascript. Однако я не могу получить доступ к полю из объекта и присвоить его текстовому полю.
Возвращаемый объект JSON
:
[{"model": "inventory.inventory","pk": 1, "fields":
{"product": "nice", "title": "Asus", "amount": 56000}},
{"model": "inventory.inventory", "pk": 2, "fields":
{"product": "nice", "title": "Lenovo", "amount": 55000}}]
Код javascript, который я использую:
<html>....{{ data|json_script:"hello-data" }}....
<script type="text/javascript">
const data = JSON.parse(document.getElementById('hello-data').textContent);
document.getElementById('id_line_one').onchange = function(){
var line_one=document.getElementById('id_line_one').value;
var id=line_one-1;
document.getElementById('id_line_one_unit_price').value = data[id].fields.amount;
};
</script>....</html>
Выпадающее значение возвращает свой первичный ключ, т.е.
product_number
, и в основном я хочу получить amount
продукта, связанного с этим product_number
.
Поскольку объекты хранятся с 0(?) в JSON, я думал, что логика моего кода была правильной, но я не эксперт, поэтому я уверен, что делаю какую-то глупую ошибку.
Как я могу вернуть сумму объекта в текстовом поле unit price
, когда название выбрано в выпадающем списке?
Спасибо!
views.py
@login_required
def add_invoice(request):
form = InvoiceForm(request.POST or None)
data = serializers.serialize("json", Inventory.objects.all())
total_invoices = Invoice.objects.count()
queryset = Invoice.objects.order_by('-invoice_date')[:6]
if form.is_valid():
form.save()
messages.success(request, 'Successfully Saved')
return redirect('/invoice/list_invoice')
context = {
"form": form,
"title": "New Invoice",
"total_invoices": total_invoices,
"queryset": queryset,
"data": data,
}
return render(request, "entry.html", context)
в вашем случае лучше использовать array.find()
document.getElementById('id_line_one').onchange = function(event){
let elementInData = data.find(() => item.pk == event.target.value);
document.getElementById('id_line_one_unit_price').value = elementInData && elementInData.amount ? elementInData.amount : 0;
};
но вы можете создать свои данные в виде словаря:
data = serializers.serialize("json", Inventory.objects.in_bulk())
после этого вы должны увидеть в javascript:
data = JSON.parse(document.getElementById('hello-data').textContent);
// data is {1: {"model": "inventory.inventory","pk": 1, "fields":
{"product": "nice", "title": "Asus", "amount": 56000}}, ...}
после этого вы можете достичь каждого элемента с помощью клавиш:
document.getElementById('id_line_one_unit_price').value = data[event.target.value].fields.amount
без arr.find().