如何在javascript中使用tal变量?

2 投票
2 回答
1431 浏览
提问于 2025-04-18 08:15

我想把从zope模板返回的一个变量传递到Pyramid中的一个JavaScript变量里。

这是视图的代码:

def return_table(request):
selected = request.params.getall("selectedcategories")

return {'selected': selected}

这是模板的代码:

<script tal define:"selected ${selected}">
    var selected = ${selected}
    $.ajax({
        type:"POST",
        url: '/return_table.json?selectedcategories=' + selected,
        async: false,
        success: function (response) {
            console.log(response)
        }
   })
</script>

但是这样不行。我想把选中的值传递给JavaScript变量。

2 个回答

1

使用

var selected=${structure:selected};

并在脚本标签中移除

tal define:"selected ${selected}"

2

最安全的方法是通过HTML5的 data 属性来传递变量,或者在 <head> 标签内使用 <meta> 标签。

<script id="my-script" data-selected="${selected}">
    $(document).ready(function() {

        var selected = $("#my-script").attr("data-selected");

        $.ajax({
            type:"POST",
            url: '/return_table.json?selectedcategories=' + selected,
            async: false,
            success: function (response) {
                console.log(response)
            }
       })
    });
</script>

关于数据属性的更多信息可以查看这里: http://caniuse.com/#feat=dataset

你也可以生成一个 <script> 代码块,把变量暴露为JavaScript的全局变量,然后在你的JavaScript代码中直接读取这些全局变量:

<script>
     window.myVar = "${selected}";
</script>     

<script>
     ... code goes here ...
</script>

... 不过我不推荐这种做法,因为包含用户输入的变量会让你的网站面临攻击风险,而且在HTML中处理JavaScript变量也比较复杂。不过如果你需要传递多个变量,这种方法还是挺方便的——你可以使用 json.dumps() 将一个Python字典转换成一个包含所有变量的JavaScript对象。

撰写回答