Передача объектов из Django в Javascript DOM


Answers

Хорошо, я нашел решение!

В основном это было из-за не цитирования результатов. Когда Javascript пытался проанализировать объект, это не было распознано как строка.

Итак, первый шаг:

var js_list = {{django_list}}; 

изменился на:

var js_list = "{{django_list}}";

После этого я понял, что Django избегает персонажей, поэтому мне пришлось их заменить следующим образом:

 var myJSONList = (("{{json_list}}").replace(/&(l|g|quo)t;/g, function(a,b){
                return {
                    l   : '<',
                    g   : '>',
                    quo : '"'
                }[b];
            }));

 myData = JSON.parse( myJSONList );

Примечание. Я попытался избежать экранирования символов из Django, используя это :

var js_list = "{{json_list|safe}}"; 

Но это не работает, потому что это путает с кавычками.

Наконец, я нашел способ избежать логики на бэкэнде конвертации в JSON, прежде чем отправлять его в Javascript:

var myDjangoList = (("{{django_list |safe}}").replace(/&(l|g|quo)t;/g, function(a,b){
            return {
                l   : '<',
                g   : '>',
                quo : '"'
            }[b];
        }));

myDjangoList = myDjangoList.replace(/u'/g, '\'')
myDjangoList = myDjangoList.replace(/'/g, '\"')

myData = JSON.parse( myDjangoList );

Я уверен, что это можно улучшить, я позволю этому вам;)

Спасибо за ваши ответы

Надеюсь, это поможет кому-то еще!

Question

Я пытаюсь передать набор запросов из Django в шаблон с javascript.

Я пробовал разные подходы к решению этого:

1. Обычный подход. Javascript все испортил, пытаясь разобрать объект из-за номенклатуры [& gt; Object: ID & lt; & gt; Object: ID & lt; ...]

Просмотр Django

django_list = list(Some_Object.objects.all())

Шаблон HTML + JS

<script type="text/javascript" >
    var js_list = {{django_list}};
</script>

2. JSON Approach - Django не удается преобразовать список объектов в строку json, не является сериализуемым JSON

Просмотр Django

django_list = list(Some_Object.objects.all())
json_list = simplejson.dumps(django_list)

Шаблон HTML + JS

<script type="text/javascript" >
    var js_list = {{json_list}};
</script>

Итак, мне нужна помощь здесь :)

У кого-нибудь есть предложение / решение?

Благодаря!




Django предлагает встроенную помощь для самого сценария, который вы пытаетесь сделать здесь. Это выглядит примерно так:

В вашем представлении есть последовательность python, список, словарь и т. Д., Назовем его py_object . Один из подходов состоит в том, чтобы jsonify его перед передачей его в механизм рендеринга.

from django.shortcuts import render_to_response
import json  

Затем, позже, используйте это ...

render_to_response('mypage.html',{'js_object':json.dumps(py_object)})

В вашем шаблоне используйте safe фильтр для импорта уже jsonized-объекта из python в javascript, например ...

data = {{ js_object|safe }}

Это должно решить вашу проблему, я надеюсь.




Вы можете использовать комбинацию safe и escapejs встроенного фильтра в Django.

var json_string = unescape({{json_list | safe | escapejs}});
var json_data = JSON.parse(json_string);



Ваша проблема заключается в том, что, как часто, ваши требования недоопределены. Что именно вы хотите, чтобы JSON выглядел? Вы говорите, что хотите «сериализовать запрос», но в каком формате? Вам нужны все поля из каждого экземпляра модели, выбор или просто представление юникода? Когда вы ответили на этот вопрос, вы узнаете, как решить свою проблему.

Например, одним из способов может быть использование метода queryset для вывода словаря полей для каждого экземпляра и сериализации (необходимо сначала преобразовать его в список):

data = SomeObject.objects.values('field1', 'field2', 'field3')
serialized_data = simplejson.dumps(list(data))



Links