Решение
Я создал собственный шаблонный фильтр, см. пользовательские шаблонные теги и фильтры .
from django.core.serializers import serialize
from django.db.models.query import QuerySet
from django.utils import simplejson
from django.utils.safestring import mark_safe
from django.template import Library
register = Library()
def jsonify(object):
if isinstance(object, QuerySet):
return mark_safe(serialize('json', object))
return mark_safe(simplejson.dumps(object))
register.filter('jsonify', jsonify)
jsonify.is_safe = True
Важны вызовы mark_safe. В противном случае Джанго избежит этого.
В шаблоне:
//Without template filter (you'll need to serialise in the view)
var data = jQuery.parseJSON('{{ json_data|safe }}');
alert(data.length);
//Using the template filter
var data2 = jQuery.parseJSON('{{ record_list|jsonify }}');
alert(data2.length);
Обратите внимание на одинарные кавычки вокруг тега шаблона.
Хотя мой следующий вопрос будет - ДЕЙСТВИТЕЛЬНО ли это безопасно?
Обновление
Обновленная версия, работающая в django 1.8 вышеупомянутого тега шаблона, которая также обрабатывает передаваемый список плоских значений, т.е. values_list ('myfield', flat = True):
from django.core.serializers import serialize
from django.db.models.query import QuerySet, ValuesListQuerySet
from django.template import Library
import json
register = Library()
@register.filter( is_safe=True )
def jsonify(object):
if isinstance(object, ValuesListQuerySet):
return json.dumps(list(object))
if isinstance(object, QuerySet):
return serialize('json', object)
return json.dumps(object)