gpt4 book ai didi

javascript - Django 模板 - 将 Python 列表转换为 JavaScript 对象

转载 作者:IT老高 更新时间:2023-10-28 21:15:09 26 4
gpt4 key购买 nike

我正在开发一个 Django/Python 网站。我有一个页面,我想在其中显示搜索结果表。结果列表照常传递给模板。

我还想让 JavaScript 代码可以访问这个对象列表。

我的第一个解决方案是创建另一个返回 JSON 的 View 。格式。但是每个页面加载都需要调用两次查询。所以我尝试只使用 JSON View 下载数据并使用 JavaScript 打印表格。

但这也是不可取的,因为现在表示层已混入 JavaScript 代码中。

有没有办法在页面呈现时从 Python 列表创建一个 JavaScript 对象?

最佳答案

解决方案

我创建了一个自定义模板过滤器,请参阅 custom template tags and filters .

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 的调用很重要。否则 Django 将逃脱它。

在模板中:

//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)

关于javascript - Django 模板 - 将 Python 列表转换为 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com