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 после его разбора.

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