Json.dumps возвращает объекты в виде строки вместо объекта JSON
В views.py
:
data1 = Inventory.objects.values_list('product_number','amount') data = json.dumps(list(data1), cls=DjangoJSONEncoder)
.
Я передаю data
в качестве контекста в html-файл.
В HTML файле, используя JS, я обращаюсь к объекту JSON с помощью следующего кода:
{{ data|json_script:"hello-data" }}
<script type="text/javascript">
var data = JSON.parse(document.getElementById('hello-data').textContent);
document.getElementById('id_line_one').onchange = function(event){
console.log(typeof data)
alert(data);
document.getElementById('id_line_one_unit_price').value = data[this.value];
};
</script>
Я ожидаю, что var data
будет словарем, но, похоже, это String. Object.fromEntries
не работает, и я получаю ошибку Uncaught TypeError: Iterator value [ is not an entry object at Function.fromEntries (<anonymous>)
.
JSON.parse
удаляет двойную кавычку, и я получаю [[1, 56000], [2, 55000]]
, но я не могу получить доступ к нему как к словарю. Всякий раз, когда я использую индекс для доступа к нему, он возвращает одиночные символы в качестве вывода вместо того, чтобы воспринимать его как объект dict. Как я могу преобразовать его в словарь? Спасибо
Проблема в том, что вы получаете список из следующей строки:
data1 = list(Inventory.objects.values_list('product_number','amount'))
Следовательно, вы просто конвертируете список в JSON, а затем разбираете этот JSON, в результате чего получается список.
Попробуйте вместо этого использовать следующее:
from django.core.serializers.json import DjangoJSONEncoder
from django.core import serializers
data_obj_model = Inventory.objects.all()
data1=serializers.serialize('json', data_obj_model, cls=DjangoJSONEncoder)
Затем вы можете получить доступ в коде JavaScript ко всем полям модели, используя data["fields"].field_of_interest
.
Или вы также можете создать пользовательский словарь с двумя интересующими вас полями следующим образом:
data1 = dict(Inventory.objects.values_list('product_number','amount'))
Это может быть использовано как словарь в JavaScript после его разбора.